学习笔记40——平衡二叉树(通过后序遍历,每个节点只遍历一次)

博客围绕判断二叉树是否为平衡二叉树展开。先介绍了二叉树深度的定义,接着给出两种判断思路,简单方法是遍历节点计算左右子树深度,但节点会被重复遍历,时间效率低;优化方法是用后序遍历,根据左右子节点深度判断,最后遍历根节点时完成整棵树的判断。

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

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
二叉树的深度:从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
思路:
简单方法:在遍历树的每个节点的时候,通过函数计算得到它的左、右子树的深度,如果每个节点的左、右子树的深度都不超过1,那么它就是平衡二叉树。这种方法通过递归方法,思路简洁,但是由于一个节点会被重复遍历多次,时间效率不高。
优化方法:用后序遍历的方式遍历整棵二叉树,在遍历某节点的左、右子节点之后,可以根据它的左、右子节点的深度判断它是不是平衡的,并得到当前节点的深度。当最后遍历到树的根节点的时候,也就判断了整棵二叉树是不是平衡二叉树。
核心代码如下:

struct BinaryTreeNode{
	int m_nValue;
	BinaryTreeNode* m_pLeft;
	BinaryTreeNode* m_pRight;
};

bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth){
	if(pRoot == nullptr){ //如果该pRoot为空,则其深度为0
		*pDepth = 0;
		return true;
	}

	int left, right;
	if(IsBalanced(pRoot->m_pLeft, &left) && IsBalanced(pRoot->m_pRight, &right)){ //后序遍历左、右子树
		int diff = left - right;
		if(diff >= -1 && diff <= 1){  //某一节点的深度差不超过1时
			*pDepth = 1 + (left > right ? left : right); //该节点的深度是其左、右子树深度的较大值加1
			return true;
		}
	}
	return false;
}

bool IsBalanced(BinaryTreeNode* pRoot){
	int depth = 0;
	return IsBalanced(pRoot, &depth); //注意,取的是depth的地址
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值