【leetcode 二叉樹對稱判斷】Symmetric Tree
阿新 • • 發佈:2019-02-09
1、題目
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
2、分析
判斷一棵二叉樹本身是否是映象對稱的,這個問題可以轉化為:二叉樹的左子樹與右子樹是否是映象對稱的。3、程式碼
#遞迴
<span style="font-size:18px;">/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: bool isSymmetric(TreeNode *root) { if(!root) return true; //空樹是對稱的 return symmetric(root->left,root->right); } private: bool symmetric(TreeNode *p,TreeNode *q) /*判斷兩棵樹是否對稱*/ { if(!p && !q) return true; //都是空 if(!p || !q) return false; //只有一個空 return (p->val==q->val)&&symmetric(p->left,q->right) && symmetric(p->right,q->left); /*樹p和樹q對稱的條件:p和q的值相同,並且p的左子樹與q的右子樹對稱,p的右子樹與q的左子樹對稱*/ } };</span>
#迭代
<span style="font-size:18px;">/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode *root) {
if(!root) return true; //空樹是對稱的
stack<TreeNode *> s;
TreeNode *p=root->left,*q=root->right;
s.push(p);
s.push(q); //即使是空節點,也是可以push到棧裡的,棧並不為空。
while(!s.empty())
{
p=s.top();s.pop();
q=s.top();s.pop();
if(!p && !q) continue; //p、q都是空節點
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;
}
};</span>