【Leetcode】【Easy】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.

 

递归的解法:

新建一个递归调用自身的函数,输入是待比较的左结点和右结点,输出是对称判定结果:true or false;

 

 1 class Solution {
 2 public:
 3     bool isSymmetric(TreeNode *root) {
 4         if (!root)
 5             return true;
 6             
 7         return isSame(root->left, root->right);
 8         
 9     }
10     
11     bool isSame(TreeNode *node_l, TreeNode *node_r){
12         if (!node_l && !node_r)
13             return true;
14         
15         if (!node_l || !node_r)
16             return false;
17         
18         if (node_l->val != node_r->val){
19             return false;
20         }
21         
22         return isSame(node_l->left, node_r->right) && \
23             isSame(node_l->right, node_r->left);
24     }
25     
26 };

 

迭代的解法: 

新建两个栈用于存放待比较的左子树结点和右子树结点。每次迭代拿出两个栈中同位置元素进行比较,结束后删除此比较过的元素,并将其左右儿子压栈待比较。(还有只用一个栈的方法,并没有节省空间,略)

 

 1 class Solution {
 2 public:
 3     bool isSymmetric(TreeNode *root) {
 4         if (!root)
 5             return true;
 6             
 7         stack<TreeNode *> leftNodeStack;
 8         stack<TreeNode *> rightNodeStack;
 9         leftNodeStack.push(root->left);
10         rightNodeStack.push(root->right);
11         TreeNode *leftNode;
12         TreeNode *rightNode;
13         
14         while (!leftNodeStack.empty()) {
15             leftNode = leftNodeStack.top();
16             rightNode = rightNodeStack.top();
17             leftNodeStack.pop();
18             rightNodeStack.pop();
19             
20             if (!leftNode && !rightNode) {
21                 continue;
22             }
23             
24             if ((!leftNode && rightNode) || \
25             (leftNode && !rightNode)) {
26                 return false;
27             }
28             
29             if (leftNode->val != rightNode->val) { 
30                 return false;
31             }
32             
33             leftNodeStack.push(leftNode->left);
34             leftNodeStack.push(leftNode->right);
35             rightNodeStack.push(rightNode->right); // Notice
36             rightNodeStack.push(rightNode->left);
37         }
38         return true;
39     }
40 };

 

posted @ 2014-11-23 23:32  胡潇  阅读(158)  评论(0编辑  收藏  举报