[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 

这两颗树不同,但他们对应的中序遍历序列却相同。
posted @ 2014-06-16 22:50  Marrybe  阅读(242)  评论(0编辑  收藏  举报