100. Same Tree; 101. Symmetric Tree
阿新 • • 發佈:2020-09-19
二叉樹 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。
這樣,將來同時彈棧時,會正好彈出這兩個物件,進行對比。