####一、題目名稱 101. Symmetric Tree https://leetcode.com/problems/symmetric-tree/ ####二、題目內容算法
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).數組
翻譯: 給定一顆二叉樹,檢查它是否與本身的鏡像是同一棵樹(圍繞根節點對稱)函數
####三、解題思路 1性能
觀察規律 從最簡單開始別怕麻煩 從1個節點到 三層end 什麼樣的狀況符合條件 1 若是2個節點都不存在 2 若是2個節點存在一個 (跟節點值沒有關係) 3 若是2個節點都存在而且內容相等爲對稱 什麼樣的狀況不符合條件
判斷一個root是否對稱 步驟 1 若是root節點的左右兩個節點 p1= root->left p2=root-rgiht 都存在 而且數組相等測試
步驟 2 知足條件 1 判斷P1 和p2 這2個節點是知足對稱條件 p3=P1->left 和p4=p2-right p5=p1-right 和p6=p2 -left翻譯
步驟 3 知足條件 2 判斷 p3 和p4,p5和p6這2個節點是是否對稱 重複步驟 1和2code
class Solution { public:遞歸
bool check(TreeNode *leftNode, TreeNode *rightNode) { //01 判斷2個節點是否對稱 //2個節點都爲空 if (leftNode == NULL && rightNode == NULL) { return true; } //2個節點不對稱--結構不對稱 if (leftNode == NULL || rightNode == NULL) { return false; } //2個節點不對稱--內容不相等 if(leftNode->val != rightNode->val) { return false; } //02 左右節點的之樹也是對稱的 return check(leftNode->left, rightNode->right) && check(leftNode->right, rightNode->left); } /************************************************* Function: 101. Symmetric Tree Description: // 函數功能、性能等的描述 Input: // 輸入參數說明,包括每一個參數的做 // 用、取值說明及參數間關係。 Output: // 對輸出參數的說明。 Return: // 函數返回值的說明 Others: troy 2016.4.7 *************************************************/ bool isSymmetric(TreeNode* root) { if (root == NULL) { return true; } return check(root->left, root->right); }
};隊列
####四、解題思路 2
本身大腦是如何思考的 上面case注意ip
1 /
2 2 / \ /
3 4 4 3
第一次對比: 2和2 節點 符合條件 第二次對比:3和3節點 符合條件 第三次對比:4和4節點 符合條件
第四次對比:NULl NULL 符合條件 第五次對比:NULl NULL 符合條件
問題來了 軌跡 2 2 3 4 4 3 好像跟樹的層次遍歷順序相似 仔細對比一下 正確順序應該是 1 2 2 3 4 4 3 節點3和4 有經過根節點 不是 3 和3 屬於不相同的節點 一個隊列是解決不了這問題的就用2個隊列
兩個隊列的出隊順序 root節點左隊列A: 2 3 4 NULL NULL root節點右隊列 B :2 3 4 NULL NULL
1 /
2 2 \
3 3
第一次對比: 2和2 節點 符合條件 第二次對比:3和 Null節點 不對稱 退出
注意:若是節點是NUL也須要記錄下來 ,就是這麼死板 人一眼看出來,電腦記錄不下來
1 節點左隊列 A: 2 NULL
1 節點右隊列 B :2 3
實現步驟: 步驟 1 構造兩個隊列 leftQ,rightQ 分別表示左子樹遍歷順序 右子樹遍歷順序 步驟 2 按照層次遍歷 方法 若是2個隊列都不爲空 而後比較front 連個節點 什麼樣的狀況不符合條件 結構和內容都不對稱 步驟 3 重複步驟2 直到結束,若是方向2個隊列還有剩餘爲false
/************************************************* Function: 101. Symmetric Tree Description: 是否對稱 Input: root Output:
Return: true --對稱 false--不對稱 Others: troy 2016.4.7 *************************************************/ bool isSymmetric2(TreeNode *root) { //若是root爲null 直接返回 if(root==NULL) { return true;
}
queue<TreeNode*> leftQ;//leftQ 保存左子樹遍歷順序 queue<TreeNode*> rightQ;//rightQ 保存右子樹遍歷順序 leftQ.push(root->left); rightQ.push(root->right); TreeNode* l; TreeNode* r; while(!leftQ.empty() && !rightQ.empty()) { l = leftQ.front(); leftQ.pop(); r = rightQ.front(); rightQ.pop(); if(l == NULL && r == NULL) continue;//上面算法若是NULL 返回true 爲葉子結點 繼續遍歷 if(l == NULL || r == NULL) return false;//結構不對稱 if(l->val != r->val) return false;//數值不對稱 //注意如隊列順序 觀察出來的 3=3 4 =4 leftQ.push(l->left);//左 3 右 4 leftQ.push(l->right); rightQ.push(r->right);//右 3 左4 rightQ.push(r->left); } //若是還有剩餘說明不結構不對稱 例如 root只有一個 if(!leftQ.empty() || !rightQ.empty()) { return false; } return true;
} ####五、解題思路 3
[x] 一顆tree 我按照必定順序遍歷完畢,而後觀察規律 這個方法不可取 由於存儲結構是二叉樹 不是數組即便有規律NULL沒法完成保存下來 不能夠
[x] 一顆tree是對稱樹 那麼左右子樹遍歷順序結果是同樣的
1 /
2 2 / \ /
3 4 4 3
1 左節點中須遍歷順序 3 2 4 1 右節點中隊列 B : 2 4 3 不能夠
1 左節點後須遍歷順序 3 4 3
1 右節點後須遍歷順序 : 3 4 2 不能夠
1 左節點中須遍歷順序 3 4 2
1 右節點後須遍歷順序 : 3 4 2 能夠
缺點:必須徹底遍歷完畢才能夠知道 遍歷過程當中沒法比較
####六、 測試用例
Your input [1,2,2,#,#,3] Your answer false Expected answer false Runtime: 0 ms
####七、 總結 若是沒有推理 ,記住結論 狀況一邊就仍然不會 難點: 假如i,j2個節點 判斷是否對稱很容易 內容同樣 若是擺脫tree這麼多層次位置,集中到2個節點上進行比較 手工去演示過程 最直接解題思路 必需要完整去演示過程 若是演示不過 說明思路有問題。 遇到問題:
[ ] book 上說遍歷(先,中,後) 都是參數都是一個節點,如今變成2個節點了 不知道該如何辦了 對稱 確定是2個節點進行比較
[ ] 還有是遍歷都(遞歸方式 仍是非遞歸)記錄上下節點位置(父子) 左右節點位置很差記錄 (孩子之間)
相似題目: 104. Maximum Depth of Binary Tree Next challenges: (M) Convert Sorted List to Binary Search Tree (M) Graph Valid Tree (E) Closest Binary Search Tree Value