[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 else 24 { 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 else 49 { 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#2 3
不同 相同 不同 不同
3 \ 的中序遍历序列(左根右)为: #3#2# 先序遍历序列(根左右)为: 3#2## 后序遍历序列(左右根)为: ###23 2
这两颗树不同,但他们对应的中序遍历序列却相同。