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这就是平衡二叉树
        }
    };
  • 相关阅读:
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 382 链表随机节点
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 381 O(1) 时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Java实现 LeetCode 380 常数时间插入、删除和获取随机元素
    Linux下的iwpriv(iwlist、iwconfig)的简单应用
    OCX控件的注册卸载,以及判断是否注册
    .OCX、.dll文件注册命令Regsvr32的使用
  • 原文地址:https://www.cnblogs.com/tianzeng/p/12389748.html
Copyright © 2011-2022 走看看