zoukankan      html  css  js  c++  java
  • 面试题55

    题目地址:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/

    题目描述

    输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过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 。

    解题思路

    先序遍历+递归:首先需要知道的是二叉树的深度的计算方法,树的的深度=max(左子树深度,右子树深度) + 1。然后,我们构造递归函数tree_depth()获取当前树的深度,通过比较某子树的左右子树的深度差的绝对值,即abs(tree_depth(node->left), tree_depth(node->right)) <= 1是否成立,如果成立,则满足平衡二叉树的条件,否则,不满足,若所有子树都平衡,则整个树都满足平衡二叉树条件。此方法容易想到,但会产生大量重复计算,时间复杂度较高

    后续遍历+剪枝:对二叉树做后序遍历,自底向上返回子树深度,若发现某子树不是平衡树则 “剪枝” ,直接向上返回。我们定义函数bottom_to_top()实现自底向上返回二叉树的深度,当node的左右子树深度差小于等于1时,说明满足平衡树的条件,则返回当前子树的深度,即节点node的左右子树的深度最大值+1,否则,进行剪枝操作,返回-1,表示当前子树不满足平衡树条件。当node为空时,说明越过叶子节点,返回高度值0。

    程序源码

    先序遍历+递归(自顶向下)

    /**
     * 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 isBalanced(TreeNode* root) {
            if(root == nullptr) return true;
            return abs(tree_depth(root->left) - tree_depth(root->right)) <= 1 && isBalanced(root->left) && isBalanced(root->right); //先序遍历(根节点->左子树->右子树)
        }
        int tree_depth(TreeNode* node)
        {
            if(node == nullptr) return true;
            return max(tree_depth(node->left), tree_depth(node->right)) + 1; //返回树的深度,即树的深度等于左子树的深度与右子树的深度中的最大值+1
        }
    };

    后续遍历+剪枝(自底向上)

    /**
     * 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 isBalanced(TreeNode* root) {
            return bottom_to_top(root) != -1? true : false; //判断此树是否平衡
        }
        int bottom_to_top(TreeNode* node)
        {
            if(node == nullptr) return 0; //越过叶子节点,因为遍历节点node时,它的左右子树均已遍历过了
            int left_tree = bottom_to_top(node->left);
            if(left_tree == -1) return -1;
            int right_tree = bottom_to_top(node->right);
            if(right_tree == -1) return -1;
            int tree_depth = max(left_tree, right_tree) + 1; //子树深度
            return abs(left_tree - right_tree) <= 1 ? tree_depth : -1;
        }
    };

    参考文章

    https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/solution/mian-shi-ti-55-ii-ping-heng-er-cha-shu-cong-di-zhi/

    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    Java3D实例应用载入VRML模型
    Tomcat数据库连接池的配置方法总结
    WebGL学习笔记使用3D引擎threeJS实现星空粒子移动
    mybatis应用实例学习
    springmvc 实例应用
    springmvc定制伪REST风格及JSR303Bean校验整合
    SpringMVC中应用Ajax异步通讯
    Java3D实例应用载入3ds 模型
    Device Mutipath参数设置
    Nginx+FastCGI+Python
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12842436.html
Copyright © 2011-2022 走看看