101. Symmetric Tree的C++解法
阿新 • • 發佈:2018-12-25
一開始陷入了一個誤區,認為【對稱樹】和【中序遍歷結果對稱】是充要條件,但其實中序遍歷結果對稱的不一定是對稱樹,如[1,2,3,3,#,2,#]。所以程式碼在lintcode上通過了但是沒在leetcode上通過。(leetcode上的測試資料設計得更好一些
其實樹的問題基本都可以使用遞迴問題,在這裡不是要判斷左子樹和右子樹是否一樣,而是判斷左子樹的左子樹和右子樹的右子樹,以及左子樹的右子樹和右子樹的左子樹是否一樣。注意別忘了判斷左子樹和右子樹的值是否相等。
class Solution { public: bool isSymmetric(TreeNode * root) { if (root==NULL) return 1; return cmpTree(root->left,root->right); } bool cmpTree(TreeNode * l,TreeNode * r){ if (l==NULL) {if (r==NULL) return true; else return false;} else {if (r==NULL) return false; else return (l->val==r->val)&&cmpTree(l->left,r->right)&&cmpTree(l->right,r->left);;} } };
還有一個使用棧的非遞迴方式很巧妙。一次push或pop兩組數,比較兩組數是否相等即可。
class Solution { public: bool isSymmetric (TreeNode* root) { if (!root) return true; stack<TreeNode*> s; s.push(root->left); s.push(root->right); while (!s.empty ()) { auto p = s.top (); s.pop(); auto q = s.top (); s.pop(); if (!p && !q) continue; if (!p || !q) return false; if (p->val != q->val) return false; s.push(p->left); s.push(q->right); s.push(p->right); s.push(q->left); } return true; } };