zoukankan      html  css  js  c++  java
  • 平衡二叉树

    给定一个二叉树,判断它是否是高度平衡的二叉树。

    本题中,一棵高度平衡二叉树定义为:

    一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

    示例 1:

    给定二叉树 [3,9,20,null,null,15,7]

    3
    /
    9 20
    /
    15 7
    返回 true 。

    示例 2:

    给定二叉树 [1,2,2,3,3,null,null,4,4]

    1
    /
    2 2
    /
    3 3
    /
    4 4
    返回 false 。

    递归

    1. 递归的返回值类型,在递归的结束时我们应该返回什么
    2. 什么是递归结束点(递归的出口),递归的出口点我们应该返回什么
    3. 本层递归拿到返回值时应该做什么事,完成之后应该返回什么

    一篇讲解递归不错的博客:https://lyl0724.github.io/2020/01/25/1/

    code:递归后序遍历

    /**
     * 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 {
    private:
        struct ReturnVal//返回值类型
        {
            bool isBalance;
            int height;
            ReturnVal(bool isB,int h):isBalance(isB),height(h){}
        };
    private:
        ReturnVal isBalancedCore(TreeNode* root)
        {
            if(root==nullptr)//递归结束条件,结束时应该返回什么
                return ReturnVal(true,0);
            //本层递归应该干什么,完成之后应该返回什么,如果某一子树不是平衡二叉树,则整棵树不是平衡二叉树,直接把这颗子树的根节点高度设成-1代表不平衡,因为没有树的高度为-1
            ReturnVal left=isBalancedCore(root->left);
            ReturnVal right=isBalancedCore(root->right);
            if(left.isBalance==false||right.isBalance==false||left.height==-1||right.height==-1)
                return ReturnVal(false,-1);
            
            return abs(left.height-right.height)>1?ReturnVal(false,-1):ReturnVal(true,max(left.height,right.height)+1);
        }
    public:
        bool isBalanced(TreeNode* root) {
            if(root==nullptr)
                return true;
    
            return isBalancedCore(root).isBalance;
        }
    };

     code2:code1的简化

    /**
     * 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 {
    private:
        int isBalancedCore(TreeNode* root)//递归返回值类型——返回以root为根节点的树的高度
        {
            if(root==nullptr)//递归出口
                return 0;
            //本层递归应该干什么
            int leftHeight=isBalancedCore(root->left);
            if(leftHeight==-1)
                return -1;
            int rightHeight=isBalancedCore(root->right);
            if(rightHeight==-1)
                return -1;
    
            return abs(leftHeight-rightHeight)>1?-1:max(leftHeight,rightHeight)+1;
        }
    public:
        bool isBalanced(TreeNode* root) {
            if(root==nullptr)
                return true;
    
            return isBalancedCore(root)!=-1;//返回树的最大高度,如果不为-1这就是平衡二叉树
        }
    };
  • 相关阅读:
    HTTPS证书撤销
    前端跨域问题解析
    js递归遍历key
    阿里云centos配置nginx和nodejs
    Linux 查看服务器配置
    解决IPOD NANO7无法开机
    GIF添加3D加速
    关于bootstrap Modal弹窗 滚动条的问题
    Just-In-Time Debugging in Visual Studio 禁止VS在服务器上调试
    利用ASP.NET操作IIS (可以制作安装程序)
  • 原文地址:https://www.cnblogs.com/tianzeng/p/12389748.html
Copyright © 2011-2022 走看看