1. 程式人生 > 實用技巧 >100. Same Tree; 101. Symmetric Tree

100. Same Tree; 101. Symmetric Tree

二叉樹 Binary Tree

問題:

給定 層序遍歷的陣列 表示二叉樹。

⚠️ 注意:leaf節點:既無左孩子,又無右孩子

  • 100. 判斷兩棵二叉樹是否相同。
  • Example 1:
    Input:     1         1
              / \       / \
             2   3     2   3
    
            [1,2,3],   [1,2,3]
    
    Output: true
    
    Example 2:
    Input:     1         1
              /           \
             2             2
    
            [1,2],     [1,null,2]
    
    Output: false
    
    Example 3:
    Input:     1         1
              / \       / \
             2   1     1   2
    
            [1,2,1],   [1,1,2]
    
    Output: false
    

      

  • 101. 判斷一顆二叉樹是否 關於中心軸 對稱。
  • For example, this binary tree [1,2,2,3,4,4,3] is symmetric:
    
        1
       / \
      2   2
     / \ / \
    3  4 4  3
     
    
    But the following [1,2,2,null,3,null,3] is not:
    
        1
       / \
      2   2
       \   \
       3    3
     
    
    Follow up: Solve it both recursively and iteratively.
    

      

解法:Binary Tree (二叉樹)

模版:兩棵樹問題:

 1 def solve(p,q)
 2     // 無效節點處理
 3     if not p and not q: return...
 4     // 遞迴終點,base
 5     if f(p, q): return...
 6     // 對兩棵樹的子節點,分類遞迴,討論
 7     c1 = solve(p->child, q->child)
 8     c2 = solve(p->child, q->child)
 9     ...
10     // 總結分類討論
11     return g(c1, c2, ..., p, q)
12 end

100. 判斷兩棵二叉樹是否相同。

程式碼參考:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     bool isSameTree(TreeNode* p, TreeNode* q) {
15         if(!p && !q) return true;
16         else if(!p || !q) return false;
17         bool c1 = isSameTree(p->left, q->left);
18         bool c2 = isSameTree(p->right, q->right);
19         return c1 && c2 && p->val==q->val;
20     }
21 };

101. 判斷一顆二叉樹是否 關於中心軸 對稱。

1. 遞迴 recursively(本模版做法)

程式碼參考:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     bool isSym(TreeNode* p, TreeNode* q) {
15         if(!p && !q) return true;
16         else if(!p || !q) return false;
17         bool c1 = isSym(p->left, q->right);
18         bool c2 = isSym(p->right, q->left);
19         return c1 && c2 && p->val==q->val;
20     }
21     bool isSymmetric(TreeNode* root) {
22         if(!root) return true;
23         return isSym(root->left, root->right);
24     }
25 };

2. 迭代 iteratively(while迴圈做法:引入佇列queue->儲存遞迴中的每層函式呼叫)

程式碼參考:

 1 class Solution {
 2 public:
 3     bool isSymmetric(TreeNode* root) {
 4         TreeNode *l, *r;
 5         if(!root) return true;
 6         l = root->left;
 7         r = root->right;
 8         queue<TreeNode*> p, q;
 9         p.push(l);
10         q.push(r);
11         while(!p.empty() || !q.empty()) {
12             l = p.front();
13             r = q.front();
14             p.pop();
15             q.pop();
16             if(!l && !r) {
17                 continue;
18             } else if(!l || !r || l->val != r->val) {
19                 return false;
20             }
21             p.push(l->left);
22             p.push(l->right);
23             q.push(r->right);
24             q.push(r->left);
25         }
26         return true;
27     }
28 };

⚠️ 注意:

仍然是劃分為兩棵樹 p,q 做對比。

最後壓棧時,將要進行對比的兩顆子樹,分別放入p和q中。

例如,我們下一次要對比 l->left VS r->right

那麼將l->left 壓入p,同時,將r->right 壓入q。

這樣,將來同時彈棧時,會正好彈出這兩個物件,進行對比。