101. Symmetric Tree
作者:互联网
仅供自己学习
思路:
递归:判断是否镜像,那就每次用左子树的左子树与右子树的右子树 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