求二元树的深度

题目:输入一颗二元树的根节点,求该树的深度。从根节点到叶子节点形成的一条路径,最长路径就是树的深度。

思路:

1.遍历该树,得到所有路径长度,求出最大的路径长度,即为树的深度

2.采用递归思想,先求左子树的深度A,再求右子树的深度B,树的深度为max(A,B) + 1

3.我们迭代树的最左分支,保存它的深度A,并递归每个最左分支节点的右子树的深度,计算右子树的最大深度为B,那么max(A,B)就是树的深度

代码如下:

思路2

int GetDepthOfTree_solution1(const Tree *root){
	int l,r;
	if(root == NULL) return 0;
	l = GetDepthOfTree(root->left);
	r = GetDepthOfTree(root->right);
	return (l > r ? l + 1 : r + 1);
}
简化:

int GetDepthOfTree_solution1(const Tree *root){
	if(root == NULL) return 0;
	return (l + max(GetDepthOfTree(root->left),GetDepthOfTree(root->right))
}

要遍历该树的每个节点,所以该思路的时间复杂度是:Θ(n)

思路3:

//iterate over the left branches and recurse on the right ones
//Input: root - the head
//Output:depth of the tree
int GetDepthOfTree_solution2(const BSTreeNode *root)
{
	return GetDepth(root, 0);
}


int GetDepth(const BSTreeNode *root, int dl)
{
	int dr, dmr;
	for(dmr = dr = dl; root != NULL; dl++){
		if((dr = GetDepth(root->m_pRight,dl + 1)) > dmr)
			dmr = dr;
		root = root->m_pLeft;
	}


	return (dl > dmr ? dl : dmr);
}

dl:最左分支的深度

dr:每个最左分支的节点的右子树的深度

dmr:所有最左分支的节点的右子树的最大深度

内存中堆的空间不是动态分配的,所以可能超出堆的空间,特别是在每个递归都调用两个递归函数。如果你的树是平衡二叉树,它的函数调用次数将达到log(N)^2次。但是如果用思路3的话栈的空间不会增长太快。

平衡二叉树:空树或者它的左右子树的高度的绝对值不超过1

时间复杂度依然是Θ(n)


参考:

http://zhedahht.blog.163.com/blog/static/25411174200732975328975/

http://stackoverflow.com/questions/1919956/a-recursive-method-to-find-depth-of-a-anynot-necessarily-complete-binary-tree



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值