求二叉树的高度算法
A. 怎么计算二叉树高度
分析二叉树的深度(高度)和它的左、右子树深度之间的关系。从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加 1 。
int Depth (BiTree T ){ // 返回二叉树的深度
if ( !T ) depthval = 0;
else {
depthLeft = Depth( T->lchild );
depthRight= Depth( T->rchild );
depthval = 1 + (depthLeft > depthRight ?
depthLeft : depthRight);
}
return depthval;
}
(1)求二叉树的高度算法扩展阅读:
一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且或者最后一层是满的,或者是在右边缺少连续若干结点,则此二叉树为完全二叉树。具有n个结点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2k-1个叶子结点,至多有2k-1个结点。
二叉树的深度是从根节点开始(其深度为1)自顶向下逐层累加的;而二叉树高度是从叶节点开始(其高度为1)自底向上逐层累加的。虽然树的深度和高度一样,但是具体到树的某个节点,其深度和高度是不一样的。
B. 求二叉树高度的原理、算法是什么,越详细越好,C语言,谢谢
首先分析二叉树的深度(高度)和它的左、右子树深度之间的关系。从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加
1
。
int
Depth
(BiTree
T
){
//
返回二叉树的深度
if
(
!T
)
depthval
=
0;
else
{
depthLeft
=
Depth(
T->lchild
);
depthRight=
Depth(
T->rchild
);
depthval
=
1
+
(depthLeft
>
depthRight
?
depthLeft
:
depthRight);
}
return
depthval;
}
C. 什么是二叉树如何计算二叉树的高度
看左子树高还是右子树高,高的那个的高度加一就是整个二叉树的高度了。利用这个关系,搞个递归就出来了。
D. 以二叉链表作存储结构,试编写求二叉树高度的算法
主方法调用RootFirst(&root,0);即可,g_nMax 即为最终的树启正的高度。
int g_nMax = 0;
voild RootFirst(TreeNode *p,int nLevel)
{
if (null == p->left && null == p->right) //当前为叶子节点
{
if (g_nMax < nLevel)
{
g_nMax = nLevel;
return;
}
}
if(null != p->left )
{
RootFirst(p->left,nLevel+1);//遍历左亏岩子树
}
if(null != p->right)
{
RootFirst(p->right,nLevel+1);//遍历右悄空悔子树
}
}
E. 求二叉树的高度
公式:V0=(V2)
+2(
V3)+3
(V4)....(k-1)(Vk)+1
所有的树都满足这个公式,其中v0...vk代表
度为0...K的节点个数。
所有计算度与节点个数的问题无论是几叉树的都必须用这个式子,我建议楼主哥哥记住!
叶子节点就是度为0的节点V0,其他的分支节点度都为m那么就只存在度为0和度为m的节点
代入上面公式:
V0=(m-1)Vm+1
又因为:
Vm+V0=n
//因为树总共n个节点
解这个方程组,就得
V0=((m-1)n+1)/m
用计算机计算
,你可以将它理解成一个层序遍历的过程,使用队列来遍历:
存储结构是
typedef
struct
Node
{
int
data;
struct
node
*FirstChild;
struct
node
*NextBrother;
}*Tree;
static
int
leafnum;
//全局函数用于计数叶子节点
void
BFSCount(Tree
t)
{
int
i=0;
SeqQueue
*Q;
TreeNode
*p;
InitQueue(Q);
if(t==NULL)
return;
EnterQueue(Q,t);
While(!Empty(Q))
{
DeleteQueue(Q,p);
//出队
然后判断这个节点
if(p->FirstChild==NULL)
leafnum++;
//如果这个节点一个孩子也没有,则是叶子,计数+1
else{
p=t->FirstChild;
//否则开始将它第一个孩子继续进入队
EnterQueue(Q,p);
while(i<=m)
//把第一个孩子的下一个兄弟依次入队
{
p=p->NextBrother;
EnterQueue(Q,p);
}
}
}
}
F. 求一个二叉树的高度 用递归的方法
如果是结点的定义中有深度这个属性,那么用一个队列就可以了。
队首放节点
队尾取出节点
比如:根节点放入队列
(开始只有这个一个节点在队列中)
然后呢
从队尾取出这个根节点
然后打散
把他的左右孩子放虚粗则入对首(这时候有2个节点
也就是二叉树的第二层)
之后凳脊从队伍里取出这2个差棚节点
打散
之后队伍里应该是
二叉树第三层的4个节点
。。。。。
这样就把二叉树层次遍历了
因为有些节点没有孩子节点
也就是叶子
这个队列中的节点
逐渐会越来越少
最后一个取出队列的节点
的深度也就是二叉树的高度
如果结点定义没有深度,我写了一个方法,请楼主参考。
public
static
int
findlevel(binarynode
root)
{
arraylist
>
result=new
arraylist
>();
linkedlist
list=new
linkedlist
();
list.add(root);
result.add(list);
int
level=0;
while(true)
{
list=new
linkedlist
();
for(int
i=0;i
0)
result.add(list);
else
break;
level++;
}
return
level;
}
其实思路和刚才说的是大同小异的,用一个level来记录二叉树的层次,最底的层次就是他的高度。
每一层都存在单独的list里,这些list再存在一个arraylist里,这样很容易就能知道每一层有哪些结点,如果这些结点有孩子,就把level++,直到某一层没有任何结点有孩子,这时候level就是最后一层了。
G. 二叉树的高度是多少
二叉树的高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0。
二叉树的高度是垂直方向上树的长度的量度。 叶节点的高度为0,因为它们下磨桥正面没有节点。 二叉树的根节点的高度是整个树的高度。 特定节点的高度是从该节点到叶节点的最长路径上的边数。
特点:
很多时候,人们对二叉树的深度和高度感到困惑。 这瞎悔是因为二叉树的深度始终等于二叉树的高度,但是它们不相同,并且互换使用这些术语是不正确的。 因此,重要的是要了解二叉树的高度和深度之间的差异。
二叉树的高度是垂直方向上树的长度的量度,它是从孩子到父母的向上方向测量的,叶节点的高度为0,因为它们下面没有节点。二叉树的根节点的高度是消裂整个树的高度。 特定节点的高度是从该节点到叶节点的最长路径上的边数。
H. 已知完全二叉树的节点数怎么求高度
就是求log以2为底的结点数的对数下取整+1,比如一颗完全二兄卜叉树的结点数为2000,则log以2为底2000的对数的下取整等答尘迟于10,然清李后+1,就等于11,望采纳
I. 求一个二叉树的高度 用递归的方法
先一层一层的遍历二叉树 用一裂迹个辅助的数据结构队列
队列! 注意 这个很重要
队首放节点 队尾取出节点
比如:根节点放入队列 (开始只有这个一个节点在队列中)
然后呢 从队尾取出这个根节点肆核并 然后打散 把他的左右孩子放入对首(这时候有2个节点 也就是二叉树的第二层)
之后从队伍里取出这2个节点 打散 之后队伍里应氏搭该是 二叉树第三层的4个节点
。。。。。
这样就把二叉树层次遍历了
因为有些节点没有孩子节点 也就是叶子
这个队列中的节点 逐渐会越来越少
最后一个取出队列的节点 的深度也就是二叉树的高度
所以求二叉树的高度 就用这种层进性遍历 每次把节点放入队列中时 也把他的深度 和节点的指针一起放入 取出一个节点 打散的时候 注意他的子节点的度是他父节点的+1 就ok