2021-6-12 日记 C++(三十一)

输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]
返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]
返回 false 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路
1、首先了解怎么样才算平衡二叉树,如何判断二叉树是否平衡。如果根节点的左右子树深度差大于1,那么就可以判断不是平衡二叉树,反之则是平衡二叉树。
2、考虑到二叉树的特性,采用递归的方式遍历整个二叉树的所有节点,并且在遍历过程中记录当前节点的深度。若当前节点左右子树都为空,则将深度记作-1,反之将深度记为深度较大者+1
3、每个节点遍历完后,返回给上一级节点当前节点的深度值,如果左右子树深度差大于1就返回-1,表示已经很大可能不是平衡二叉树了(极少数特殊情况除外),否则返回当前节点的深度
4、整个二叉树遍历完后,通过判断返回的值是-1还是二叉树的深度,来判断二叉树是否平衡二叉树

class Solution {
public:
    bool isBalanced(TreeNode* root) {
        return dfs(root)!=-1;
    }
    int dfs(TreeNode* node)
    {
        if(node!=NULL)
        {
            int left_depth=dfs(node->left);
            if(left_depth==-1)
            {
                return -1;
            }
            int right_depth=dfs(node->right);
            if(right_depth==-1)
            {
                return -1;
            }
            return abs(left_depth - right_depth) >1 ? -1 : max(left_depth,right_depth)+1;
        }
        else
        {
            return 0;
        }
    }
};
上一篇:CF1540B-Tree Array


下一篇:树的递归专题