vlambda博客
学习文章列表

NC16 判断二叉树是否对称

情景提要

    牛客题解系列,按照题号顺序开始。







N
C1
6
 判断二叉树是否对称







01




题目描述

NC16 判断二叉树是否对称

02




输入输出示例

入: 

     {1,2,2}

输出: 

     true


03




题目分析

NC16 判断二叉树是否对称














      二叉树的问题,还是两种方法,递归或者迭代。

      递归就是要想好判断条件和要比较的两个结点。只要有一个左右两个结点不一样的时候返回false。要比较的两个结点应该是左边的树的左节点和右边的树的右节点,左边树的右节点和右边树的左节点。有一个是false就返回false,所以是&&的关系。

      迭代的方法用队列或者栈都可以,依次弹出两个结点进行比较就可以。需要注意的是放入的顺序。可以通过自己画树模拟来搞清楚该按照什么顺序放入。




03




代码实现


方法1


/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */
class Solution {public: /** * * @param root TreeNode类 * @return bool布尔型 */ // 方法1:递归 bool isSymmetric(TreeNode* root) { // write code here if(!root) return true; return travel(root->left,root->right); } bool travel(TreeNode* l,TreeNode* r){ if(!l && !r) return true; else if(!l || !r) return false; else if(l->val != r->val) return false; else return travel(l->left,r->right) && travel(l->right,r->left); }};



方法2


/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */
class Solution {public: /** * * @param root TreeNode类 * @return bool布尔型 */ // 方法2:迭代 队列模拟,两两一组 bool isSymmetric(TreeNode* root) { // write code here if(!root) return true; queue<TreeNode*> q; q.push(root->left); q.push(root->right); TreeNode* l,*r; while(!q.empty()){ l = q.front(); q.pop(); r=q.front(); q.pop(); if(!l && !r) continue; else if(!l || !r) return false; else if(l->val != r->val) return false; else { q.push(l->left); q.push(r->right); q.push(l->right); q.push(r->left); } } return true; }};




04




NC16 判断二叉树是否对称

     二叉树的迭代和递归两种方法。对称问题需要注意的是应该比较哪两个结点,就决定了递归方法的函数传入参数和迭代方法的数据结构的结点放入的顺序。

NC16 判断二叉树是否对称















NC16 判断二叉树是否对称

NC16 判断二叉树是否对称

欢迎评论区留言讨论哦