ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

101. Symmetric Tree

2021-02-09 19:35:41  阅读:173  来源: 互联网

标签:左子 right TreeNode 右子 Tree Symmetric NULL 101 left


仅供自己学习

 

思路:

递归:判断是否镜像,那就每次用左子树的左子树与右子树的右子树 and 左子树的右子树和右子树的左子树进行是否相等的判断即可。因此我们可以写一个比较函数,传入的root就是前面所说的几种情况。

比较函数什么时候返回true什么时候返回false呢,如果我们在一条路下去的中途出现了不相等,或者左右子树不等高的情况那么我们就返回false,如果中途全都相等,遍历到叶子节点后,左右子树同时为NULL后,那么我们就返回true。边界条件,root为空也视为镜像的一种情况,返回true即可。

 

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     bool isSymmetric(TreeNode* root) {
15         if(root==NULL) return true;
16         return isSymmetric(root->left,root->right);
17     }
18     bool isSymmetric(TreeNode* left,TreeNode* right){
19         if(left==NULL&&right==NULL) return true;  //整个过程没有错误的情况就可以输出 true
20         if(left==NULL&&right!=NULL||left!=NULL&&right==NULL||left->val!=right->val) return false; //所有不正确的情况都返回false
21         return isSymmetric(left->left,right->right)&&isSymmetric(left->right,right->left);  //传入的是左子树的左子树和右子树的右子树比较 and 左子树的右子树和右子树的左子树进行比较,同时为true才能算镜像
22     }
23         
24 };

 

迭代:

用两个队列分别存储第一个结点的左子树和右子树,因为是左子树的左子树和右子树的右子树对比,左子树的右子树和右子树的左子树进行对比,所以在将节点加入进queue里的时候,对于存储第一个结点左子树的队列,按照左右的顺序添加,而对于存储第一个节点的右子树的队列,按照右左的顺序添加。这样当我们取出来的时候就满足左子树的左子树和右子树的右子树对比,左子树的右子树和右子树的左子树进行对比。 然后返回false的条件和递归的相同,返回true也是相同的 就是当队列空也就是当遍历到叶子结点后的NULL结点就结束,但是在途中会遇到某个左子树是NULL,但右子树不是的情况,所以要加入一个if判断是否在途中遇到了NULL结点,遇到且两个节点都是NULL则continue,进行同一层的其他结点的判断是否满足条件

 

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 8  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 9  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10  * };
11  */
12 class Solution {
13 public:
14     bool isSymmetric(TreeNode* root) {
15         if(root==NULL) return true;
16         queue<TreeNode*> nums1;
17         queue<TreeNode*> nums2;
18         nums1.push(root->left);
19         nums2.push(root->right);
20         while(!nums1.empty()&&!nums2.empty()){
21             TreeNode* node1=nums1.front(); nums1.pop();
22             TreeNode* node2=nums2.front(); nums2.pop();
23             if(!node1 && !node2) continue;   //这里之前用了node1->val == node2->val 是错误的,这样无法判断空结点的情况,这样的判断虽然只能判断是否都为空结点无法判断val是否相等,但其实不需要判断VAL相不相等,因为下一个如果不相等就满足了下一个if的条件就会返回false
24             if((node1==NULL&&node2!=NULL)||(node1!=NULL&&node2==NULL)||(node1->val != node2->val)) return false;
25             
26             nums1.push(node1->left);
27             nums1.push(node1->right);
28             nums2.push(node2->right);
29             nums2.push(node2->left);
30         }
31         return true;
32 
33     }
34         
35 };

 

标签:左子,right,TreeNode,右子,Tree,Symmetric,NULL,101,left
来源: https://www.cnblogs.com/Mrsdwang/p/14393969.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有