码迷,mamicode.com
首页 > 其他好文 > 详细

《从头再来》剑指offer.28 对称的二叉树

时间:2021-06-07 19:58:23      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:tree node   左右子树   有一个   左右   参数   ret   对比   镜像   com   

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

具体来讲就是加入以根结点为中心画一条垂线,则从垂线往左右两边移动时,遇到的节点的值一定一样。这里需要借助辅助函数来对比左右节点,所以要构建辅助函数。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    //对比左右节点,所以参数为左右节点
    bool compare(TreeNode* left, TreeNode* right){
        //如果左右子树都为空,则对称
        //如果左子树存在,右子树为空,则不对称
        //如果右子树存在,左子树为空,则不对称
        //如果左子树右子树的值不同,也不对称
        if(left == nullptr && right == nullptr)    return true;
        if(left == nullptr && right != nullptr)    return false;
        if(left != nullptr && right == nullptr) return false;
        if(left->val != right->val)    return false;

        //所有的不等都对比完了,那么就是左右节点的值相等了
        //开始对比左右值
        bool outside = compare(left->left, right->right);//左子树的左节点和右子树的右节点对比
        bool inside = compare(left->right, right->left);//左子树的右节点和右子树的左节点对比
        bool isSame = outside && inside;//必须两个都为true才会返回true
        return isSame;
    }
    bool isSymmetric(TreeNode* root) {
        //递归的判断根结点的左子树是否和右子树完全一样
        //需要对比的其实是根结点左子树的左孩子和右子树的右孩子;以及根结点的左子树的右孩子和右子树的左孩子
        //首先如果root为空,则一定是true
        if(root == nullptr) return true;
        //只有一个根结点,也是true
        //if(root->left == nullptr && root->right == nullptr) return true;
        return compare(root->left,root->right);
    }
};

代码里已经解释得很清楚了,就不再解释了。

《从头再来》

《从头再来》剑指offer.28 对称的二叉树

标签:tree node   左右子树   有一个   左右   参数   ret   对比   镜像   com   

原文地址:https://www.cnblogs.com/azie420/p/14856334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!