二叉树的深度

题目:输入一颗二叉树的根结点 求该树的深度  从根结点到叶节点一次经过的节点(含根、叶结点)形成树的一条路径 最长路径为树的深度

二叉树的节点定义如下:

typedef struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft;
BinaryTreeNode* m_pRight;
};
int max(int a, int b)
{
	return a > b ? a : b;
}
</pre><pre name="code" class="cpp">
int high(BinaryTreeNode* r )
{
	if (r == NULL)
		return 0;
	return max(high(r->m_pLeft), high(r->m_pRight)) + 1;

}


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

 


bool Isbalance(BinaryTreeNode *r)
{//遍历二叉树的同时检测二叉树是否是平衡二叉树
	if (r == NULL)
		return true;
	int left = high(r->m_pLeft);
	int right = high(r->m_pRight);
	if (abs(right - left) > 1)
		return false;
	return Isbalance(r->m_pLeft) && Isbalance(r->m_pRight);
}



这种方法中 一个结点会被重复遍历多次 因此时间效率不高

如果用后序遍历的方式遍历二叉树的每一个结点 在遍历到一个结点之前 就已经遍历了它的左右子树 只要在遍历每个结点时记录它的深度 就可以一边遍历一遍判断每个结点是不是平衡的

bool Isbalances(BinaryTreeNode *r,int *deep)
{
	if (r == NULL)
	{
		*deep = 0;
		return true;
	}
	int left = 0;
	int right = 0;
	if (Isbalances(r->m_pLeft, &left) && Isbalances(r->m_pRight, &right))
	{
		*deep = max(left, right) + 1;
		return true;
	}
	return false;
}


bool IsBalanceTree(BinaryTreeNode *root)
{
	int t = 0;
	return Isbalances(root, &t);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值