首页 > 代码库 > [LeetCode OJ] Symmetric Tree
[LeetCode OJ] Symmetric Tree
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
Note:
Bonus points if you could solve it both recursively and iteratively.
confused what "{1,#,2,3}"
means?
方法一:递归实现
1 /** 2 * Definition for binary tree 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 bool canBeSymmetric(TreeNode *p, TreeNode *q)11 {12 if(p==NULL && q==NULL)13 return true;14 if((p==NULL && q!=NULL) || (p!=NULL && q==NULL))15 return false;16 17 if(p->val != q->val)18 return false;19 bool b1 = canBeSymmetric(p->left, q->right); //若二叉树p和二叉树q对称,则 p 的左子树和 q 的右子树对称20 if(b1==false)21 return false;22 bool b2 = canBeSymmetric(p->right, q->left); //若二叉树p和二叉树q对称,则 p 的右子树和 q 的左子树对称23 24 return b2;25 26 }27 28 class Solution {29 public:30 bool isSymmetric(TreeNode *root) {31 32 if(root==NULL)33 return true;34 35 return canBeSymmetric(root->left, root->right);36 }37 };
方法二:迭代实现
1 /** 2 * Definition for binary tree 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 vector<int> PreOrderTraverse(TreeNode *p) //按根左右的顺序遍历二叉树,迭代实现11 {12 vector<int> result;13 stack<TreeNode*> st;14 15 while(p || !st.empty())16 {17 if(p)18 {19 result.push_back(p->val);20 st.push(p);21 p = p->left;22 }23 else24 {25 result.push_back(0); //用0表示空树26 p = st.top();27 st.pop();28 p = p->right;29 }30 }31 result.push_back(0);32 return result;33 }34 35 vector<int> ReversePreOrderTraverse(TreeNode *p) //按根右左的顺序遍历二叉树,迭代实现36 {37 vector<int> result;38 stack<TreeNode*> st;39 40 while(p || !st.empty())41 {42 if(p)43 {44 result.push_back(p->val);45 st.push(p);46 p = p->right;47 }48 else49 {50 result.push_back(0); //用0表示空树51 p = st.top();52 st.pop();53 p = p->left;54 }55 }56 result.push_back(0);57 return result;58 }59 60 61 class Solution {62 public:63 bool isSymmetric(TreeNode *root) {64 65 if(root==NULL)66 return true;67 68 vector<int> ivec1 = PreOrderTraverse(root->left);69 vector<int> ivec2 = ReversePreOrderTraverse(root->right);70 71 return ivec1==ivec2;72 }73 };
注:
发现对于两棵完全相同的二叉树,用"#"(方法二中是用整数0,也可以用其他的代替)代替空树,他们的先序遍历序列是完全相同的,
反之也成立,即若两颗二叉树的先序遍历序列(用"#"代替空树)完全相同,那么这两颗二叉树也必然相同。
然而这一事实对于用中序遍历序列则不成立,也就是说若两颗二叉树的中序遍历序列(用"#"代替空树)完全相同,这两颗二叉树不一定相同。举例如下:
2 / 的中序遍历序列(左根右)为: #3#2# 先序遍历序列(根左右)为: 23### 后序遍历序列(左右根)为: ##3#23
不同 相同 不同 不同
3 \ 的中序遍历序列(左根右)为: #3#2# 先序遍历序列(根左右)为: 3#2## 后序遍历序列(左右根)为: ###23 2
这两颗树不同,但他们对应的中序遍历序列却相同。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。