木落长安rr

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following [1,2,2,null,3,null,3] is not:

    1
   / \
  2   2
   \   \
   3    3

Note:
Bonus points if you could solve it both recursively and iteratively.

判断是否是对称树和判断两棵树是否相同是一样的思路。

第一种方法:使用递归(C++)

 1     bool leftEqualRight(TreeNode* left,TreeNode* right){
 2         if(!left&&!right)
 3             return true;
 4         if((!left&&right)||(left&&!right)||(left->val!=right->val))
 5             return false;
 6         return leftEqualRight(left->left,right->right)&&leftEqualRight(left->right,right->left);
 7     }
 8     
 9     bool isSymmetric(TreeNode* root) {
10         if(!root)
11             return true;
12         return leftEqualRight(root->left,root->right);
13     }

第二种方法:使用迭代(C++),利用两个队列来分别存储根节点的左、右子树。首先,根节点为空,则对称,将根节点的左右子树分别压入两个队列,循环判断的条件是两个队列都不为空,当两个出队的结点都为空时,continue跳过此次判断,继续进行,当其中一个节点为空时,或者两个结点的值不相等时,跳出,false,再分别将两个结点的子树压入,左子树的左结点对应右子树的右结点,左子树的右结点对应右子树的左结点。

 1 bool isSymmetric(TreeNode* root) {
 2         if(!root)
 3             return true;
 4         queue<TreeNode*> q1,q2;
 5         q1.push(root->left);
 6         q2.push(root->right);
 7         while(!q1.empty()&&!q2.empty()){
 8             TreeNode* node1=q1.front();
 9             q1.pop();
10             TreeNode* node2=q2.front();
11             q2.pop();
12             if(!node1&&!node2)
13                 continue;
14             if((!node1&&node2)||(node1&&!node2)||(node1->val!=node2->val))
15                 return false;
16             q1.push(node1->left);
17             q2.push(node2->right);
18             q1.push(node1->right);
19             q2.push(node2->left);
20         }
21         return true;
22     }

 

posted on 2019-04-10 22:03  木落长安rr  阅读(310)  评论(0编辑  收藏  举报