LeetCode 101. 對稱二叉樹(Symmetric Tree)
阿新 • • 發佈:2018-10-10
nod 相等 二叉 說明 turn mil init node 遞歸
題目描述
給定一個二叉樹,檢查它是否是鏡像對稱的。
例如,二叉樹 [1,2,2,3,4,4,3]
是對稱的。
1
/ 2 2
/ \ / 3 4 4 3
但是下面這個 [1,2,2,null,3,null,3]
則不是鏡像對稱的:
1
/ 2 2
\ 3 3
說明:
如果你可以運用遞歸和叠代兩種方法解決這個問題,會很加分。
解題思路
本題可用遞歸和叠代兩種做法來求解。
遞歸做法是每次對於對稱的兩個節點,首先判斷是否都為空,若都為空則返回true;否則判斷兩節點是否相等,若相等則返回它們對應的子節點的比較結果;否則返回false。
叠代做法是維護一個節點隊列,每次取出隊列頭部兩個節點比較其是否相等,若不相等且兩節點均不為空,則依次把兩個節點對稱位置的子節點加入到隊列中,註意null也要加入到隊列;否則返回false
代碼
遞歸:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {}8 * }; 9 */ 10 class Solution { 11 public: 12 bool isSymmetric(TreeNode* root) { 13 if(root == NULL) return true; 14 return symmetric(root->left, root->right); 15 } 16 bool symmetric(TreeNode* left, TreeNode* right){ 17 if(left == right) return true; 18 elseif(left && right && left->val == right->val){ 19 if(symmetric(left->left, right->right) && symmetric(left->right, right->left)) 20 return true; 21 } 22 return false; 23 } 24 };
叠代:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 bool isSymmetric(TreeNode* root) { 13 if(root == NULL) return true; 14 queue<TreeNode*> q; 15 q.push(root->left); 16 q.push(root->right); 17 while(q.size()){ 18 TreeNode* node1 = q.front(); 19 q.pop(); 20 TreeNode* node2 = q.front(); 21 q.pop(); 22 if(node1 && node2){ 23 if(node1->val != node2->val) return false; 24 else{ 25 q.push(node1->left); 26 q.push(node2->right); 27 q.push(node1->right); 28 q.push(node2->left); 29 } 30 } 31 else if(node1 || node2) return false; 32 } 33 return true; 34 } 35 };
LeetCode 101. 對稱二叉樹(Symmetric Tree)