如何判断一个树是否是平衡二叉树

本文介绍了两种判断二叉树是否为平衡二叉树的方法:一种是递归求深度并判断,但存在重复计算的问题;另一种是后序遍历,通过记录每个节点的深度自下而上判断,效率更高。

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

#判断一个树是二叉平衡树

平衡二叉树十是一种高度自平衡树,它的任何一个结点的左右子树的高度之差不会查过1。

  1. 递归方法:从定义个就可以写出一个递归的解法,先求左右子树是否平衡然后,再判断自己是否平衡。代码如下
class Solution {
public:
    bool IsBalanced_Solution(TreeNode* pRoot) {
    	if(pRoot==NULL)
    		return 1;
    	int left=TreeDepth(pRoot->left);
    	int right=TreeDepth(pRoot->right);
    	int diff=left-right;
    	if(diff>1 || diff<-1)
    		return 0;
    	return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right);
    }
private:
    int TreeDepth(TreeNode* pRoot)
    {
		if(pRoot==NULL)
			return 0;
		int left=TreeDepth(pRoot->left);
		int right=TreeDepth(pRoot->right);
		return (left>right?left:right)+1;    
    }
};
  1. 递归解法2:递归算法每次先计算左右子树的深度,再计算本身的深度,然后递归的判断左右子树的时候,又计算了左右子树的深度,这是很不合理的方法,那么想要规避这个情况就可以把深度记录下来,用一个变量记录每个节点的深度,并且借助递归后序遍历树,从而先访问左子树,再访问右子树,有了这两边的高度,再判断本身。
class Solution {
public:
    bool IsBalanced_Solution(TreeNode* pRoot) {
    	int depth=0;
    	return isBalanced_Solution(pRoot,depth);
    }
private:
    bool isBalanced_Solution(TreeNode* pRoot,int& depth){
    	if(pRoot==NULL){
    		depth=0;
    		return 1;
    	}
    	int left=0,right=0;
    	if(isBalanced_Solution(pRoot->left,left) && isBalanced_Solution(pRoot->right,right)){
    		int diff=left-right;
    		if(diff<=1 && diff>=-1){
    			depth=1+(left>right?left:right);
    			return true;
    		}	
    	}
    	return 0;
    }	
};

 比较,第一种方法是递归求深度,从上往下判断是否平衡,有很多重复计算。第二种方法则是后序遍历,用一个变量保持深度,从下往上判断,只计算了一次。这个原因就在于下面平衡了,只需判断上面就可以,而上面平衡下面确不一定平衡,所以自下而上更好。

判断一个二叉是否为平衡二叉树可以通过以下步骤实现: 1. **定义平衡二叉树的性质**:平衡二叉树是一种二叉,其中每个节点的左子和右子的高度差不超过1。 2. **递归检查每个节点**:对于每个节点,检查其左子和右子的高度差是否不超过1。如果所有节点都满足这个条件,则该二叉平衡二叉树。 3. **计算子高度**:在检查每个节点时,需要计算其左子和右子的高度。可以使用递归方法计算子的高度。 以下是一个示例代码,展示了如何判断一个二叉是否为平衡二叉树: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def is_balanced(root): def check(node): if node is None: return 0 left = check(node.left) if left == -1: return -1 right = check(node.right) if right == -1 return max(left, right) + 1 return check(root) != -1 # 示例用法 # 构建一个平衡二叉树 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) root.right.left = TreeNode(6) root.right.right = TreeNode(7) print(is_balanced(root)) # 输出: True # 构建一个不平衡的二叉 unbalanced_root = TreeNode(1) unbalanced_root.left = TreeNode(2) unbalanced_root.left.left = TreeNode(3) print(is_balanced(unbalanced_root)) # 输出: False ``` 在这个示例中,`is_balanced` 函数通过递归检查每个节点的高度差来判断二叉是否为平衡二叉树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值