平衡二叉树

博客围绕判断二叉树是否为平衡二叉树展开。介绍了两种思路,思路1是遍历每个节点,根据左右子树高度差判断,不过会多次重复遍历下层节点;思路2是从下往上遍历,若子树平衡则返回高度,不平衡则停止遍历,可减少开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路1:
平衡二叉树:二叉树的左右子树距离不超过1
递归:
遍历每一个节点,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。
超过1,False
不超过1,左右子树都判断

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def IsBalanced_Solution(self, pRoot):
        # write code here
        if pRoot is None:#递归退出条件
            return True
        if abs(self.TreeDepth(pRoot.left)-self.TreeDepth(pRoot.right))>1:#根节点的左子树右子树判断
            return False
        return self.IsBalanced_Solution(pRoot.left) and self.IsBalanced_Solution(pRoot.right)#左子树右子树分别递归
    def TreeDepth(self,Root):#判断树的深度
        if Root is None:
            return 0
        left=self.TreeDepth(Root.left)
        right=self.TreeDepth(Root.right)
        return max(left,right)+1
public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        if (root==null) return true;
        if (Math.abs(TreeDepth(root.left)-TreeDepth(root.right))>1) return false;
        return (IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right));
     }
    private int TreeDepth(TreeNode pRoot){
        if (pRoot==null) return 0;
        int left=TreeDepth(pRoot.left);
        int right=TreeDepth(pRoot.right);
        return Math.max(left,right)+1;
    }
}

这种做法有很明显的问题,在判断上层结点的时候,会多次重复遍历下层结点,增加了不必要的开销。

思路2:
如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。
遍历过程中求书的高度

public class Solution {
    private boolean isBalanced=true;
    public boolean IsBalanced_Solution(TreeNode root) {
        getDepth(root);
        return isBalanced;
    }
    private int getDepth(TreeNode root){
        if(root==null) return 0;
        int left=getDepth(root.left);
        int right=getDepth(root.right);
        if(Math.abs(left-right)>1)
            isBalanced=false;
        return Math.max(left,right)+1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值