1. 程式人生 > >LeetCode 101. 對稱二叉樹(Symmetric Tree)

LeetCode 101. 對稱二叉樹(Symmetric Tree)

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 else
if(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)