1. 程式人生 > >LeetCode 872. 葉子相似的樹

LeetCode 872. 葉子相似的樹

872. 葉子相似的樹

題目描述提示幫助提交記錄社群討論閱讀解答

隨機一題

請考慮一顆二叉樹上所有的葉子,這些葉子的值按從左到右的順序排列形成一個 葉值序列 。

舉個例子,如上圖所示,給定一顆葉值序列為 (6, 7, 4, 9, 8) 的樹。

如果有兩顆二叉樹的葉值序列是相同,那麼我們就認為它們是 葉相似 的。

如果給定的兩個頭結點分別為 root1 和 root2 的樹是葉相似的,則返回 true;否則返回 false 。

解題思路:對於兩棵樹進行遍歷(先序,後序,中序都可以,葉子節點的相對順序是不會變的)把葉子節點進行入隊操作,之後比較兩個佇列中的元素然後進行判斷葉子是否相似。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void search(TreeNode* p,queue<int>& Q){
        if(p->left != NULL)
            search(p->left,Q);
        if(p->right != NULL)
            search(p->right,Q);
        if(p->left == NULL && p->right == NULL)
            Q.push(p->val);
    }
    bool leafSimilar(TreeNode* root1, TreeNode* root2) {
        queue<int>Q;
        queue<int>Q1;
        int ans;
        if(root1 != NULL)
            search(root1,Q);
        if(root2 != NULL)
            search(root2,Q1);
        
        if(Q.size() != Q1.size()) return false;
        else{
            ans = 1;
            while(Q.size() != 0){
                if(Q.front() != Q1.front()){
                    ans = 0;
                    break;
                }
                Q.pop();
                Q1.pop();
            }
        }
        if(ans == 1) return true;
        return false;
    }
};