当前位置:首页 » 操作系统 » 二叉树的高度算法

二叉树的高度算法

发布时间: 2022-05-15 18:15:42

A. 以二叉链表为存储结构,写出求二叉树高度和宽度的算法

树的高度:对非空二叉树,其深度等于左子树的最大深度加1。

Int Depth(BinTree *T){int dep1,dep2;

if(T==Null) return(0);

else{dep1=Depth(T->lchild);

dep2=Depth(T->rchild);

if(dep1>dep2) return(dep1+1);

else return(dep2+1);}

树的宽度:按层遍历二叉树,采用一个队列q,让根结点入队列,最后出队列,若有左右子树,则左右子树根结点入队列,如此反复,直到队列为空。

int Width(BinTree *T){intfront=-1,rear=-1;

/*队列初始化*/int flag=0,count=0,p;

/* pint CountNode (BTNode *t)

//节点总数{int num;if (t == NULL)num = 0;

elsenum = 1 + CountNode (t->lch) + CountNode (t->rch);

return (num);}void CountLeaf (BTNode *t)

//叶子节点总数{if (t != NULL){if (t->lch == NULL && t->rch == NULL)count ++;

// 全局变量CountLeaf (t->lch);CountLeaf (t->rch);}}。

(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. 二叉树的深度和高度有什么区别

一、概念不同

深度是从根节点数到它的叶节点,高度是从叶节点数到它的根节点。

二叉树的深度是指所有结点中最深的结点所在的层数。

对于整棵树来说,最深的叶结点的深度就是树的深度;树根的高度就是树的高度。这样树的高度和深度是相等的。

对于树中相同深度的每个结点来说,它们的高度不一定相同,这取决于每个结点下面的叶结点的深度。

二、定义不同

高度和深度是相反的表示,深度是从上到下数的,而高度是从下往上数。

三、计算方式不同

1、二叉树深度算法如下:

深度为m的满二叉树有2^m-1个结点;

具有n个结点的完全二叉树的深度为[log2n]+1.(log2n是以2为底n的对数)。

2、分析二叉树的深度(高度)和它的左、右子树深度之间的关系。从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加 1 。

(3)二叉树的高度算法扩展阅读:

树是一种重要的非线性数据结构,直观地看,它是数据元素按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。

树在计算机领域中也得到广泛应用,如在编译源程序如下时,可用树表示源源程序如下的语法结构。又如在数据库系统中,树型结构也是信息的重要组织形式之一。一切具有层次关系的问题都可用树来描述。满二叉树,完全二叉树,排序二叉树。

在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”和“右子树”。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。

D. 二叉树的高度是什么

二叉树的高度是高度是从下往上数。

二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。

完全二叉树的特点是叶子结点只可能出现在层序最大的两层上,并且某个结点的左分支下子孙的最大层序与右分支下子孙的最大层序相等或大1。



二叉树性质:

若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点:

当i=1时,该节点为根,它无双亲节点。

当i>1时,该节点的双亲节点的编号为i/2。

若2i≤n,则有编号为2i的左节点,否则没有左节点。

若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点。

E. 如何用非递归算法求二叉树的高度

如果是结点的定义中有深度这个属性,那么用一个队列就可以了。
队首放节点
队尾取出节点
比如:根节点放入队列
(开始只有这个一个节点在队列中)
然后呢
从队尾取出这个根节点
然后打散
把他的左右孩子放入对首(这时候有2个节点
也就是二叉树的第二层)
之后从队伍里取出这2个节点
打散
之后队伍里应该是
二叉树第三层的4个节点
。。。。。
这样就把二叉树层次遍历了
因为有些节点没有孩子节点
也就是叶子
这个队列中的节点
逐渐会越来越少
最后一个取出队列的节点
的深度也就是二叉树的高度
如果结点定义没有深度,我写了一个方法,请楼主参考。
public
static
int
findlevel(BinaryNode
root)
{
ArrayList<LinkedList<BinaryNode>>
result=new
ArrayList<LinkedList<BinaryNode>>();
LinkedList<BinaryNode>
list=new
LinkedList<BinaryNode>();
list.add(root);
result.add(list);
int
level=0;
while(true)
{
list=new
LinkedList<BinaryNode>();
for(int
i=0;i<result.get(level).size();i++)
{
BinaryNode
tmp=result.get(level).get(i);
if(tmp.left!=null)
list.add(tmp.left);
if(tmp.right!=null)
list.add(tmp.right);
}
if(list.size()>0)
result.add(list);
else
break;
level++;
}
return
level;
}
其实思路和刚才说的是大同小异的,用一个level来记录二叉树的层次,最底的层次就是他的高度。
每一层都存在单独的list里,这些list再存在一个arraylist里,这样很容易就能知道每一层有哪些结点,如果这些结点有孩子,就把level++,直到某一层没有任何结点有孩子,这时候level就是最后一层了。

F. 设计算法统计二叉树高度

#include<stdio.h>
#include<malloc.h>
typedef struct binode{
int data;
struct binode *lchild,*rchild;
}binode,*bitree;
typedef struct{
bitree elem[100];
int top;
}stack;
bitree creat_bt(){ //按扩展前序建二叉树
bitree t;int x;
scanf("%d",&x);
if (x==0) t=NULL;
else { t=(bitree)malloc(sizeof(binode));
t->data=x;
t->lchild=creat_bt();
t->rchild=creat_bt();
}
return t;
}
void exchange(bitree t) //左、右子树交换
{bitree p;
if(t!=NULL)
{ p=t->lchild;t->lchild=t->rchild;
t->rchild=p;
exchange(t->lchild);
exchange(t->rchild);
}
}
void inorder(bitree bt) //递归的中序遍历
{ if (bt){
inorder(bt->lchild);
printf("% d",bt->data);
inorder(bt->rchild);
}
}
main()
{bitree root;
printf("\n");
printf("建二叉树,输入元素:");
root=creat_bt(); /*create tree of useing preorder*/
printf("交换前的中序序列是:");
inorder(root);
exchange(root);
printf("\n交换后的中序序列是:");
inorder(root);
printf("\n");
}

G. 什么是二叉树如何计算二叉树的高度

看左子树高还是右子树高,高的那个的高度加一就是整个二叉树的高度了。利用这个关系,搞个递归就出来了。

H. 二叉树求高度,用栈模拟递归.怎么实现

计算二叉树的高度可以采用几种不同的算法。 算法一:采用后序遍历二叉树,结点最大栈长即为二叉树的高度; 算法二:层次遍历二叉树,最大层次即为二叉树的高度; 算法三:采用递归算法,求二叉树的高度。

I. 以二叉树链表作为二叉树的存储结构,怎么编写算法计算返回二叉树的高度

编写方法如下:

J. 二叉树算法

二叉树是没有度为1的结点。
完全二叉树定义:
若设二叉树的高度为h,除第
h
层外,其它各层
(1~h-1)
的结点数都达到最大个数,第
h
层从右向左连续缺若干结点,这就是完全二叉树。
完全二叉树叶子结点的算法:
如果一棵具有n个结点的深度为k的二叉树,它的每一个结点都与深度为k的满二叉树中编号为1~n的结点一一对应,这棵二叉树称为完全二叉树。
可以根据公式进行推导,假设n0是度为0的结点总数(即叶子结点数),n1是度为1的结点总数,n2是度为2的结点总数,由二叉树的性质可知:n0=n2+1,则n=
n0+n1+n2(其中n为完全二叉树的结点总数),由上述公式把n2消去得:n=
2n0+n1-1,由于完全二叉树中度为1的结点数只有两种可能0或1,由此得到n0=(n+1)/2或n0=n/2,合并成一个公式:n0=(n+1)/2
,就可根据完全二叉树的结点总数计算出叶子结点数。
因此叶子结点数是(839+1)/2=420

热点内容
微信平台无法上传图片 发布:2024-10-11 00:55:59 浏览:139
加密锁折断 发布:2024-10-10 23:57:30 浏览:146
上传活动成果 发布:2024-10-10 23:48:27 浏览:186
2345解压慢 发布:2024-10-10 23:48:26 浏览:199
php中文空格 发布:2024-10-10 23:36:26 浏览:757
cli编译器 发布:2024-10-10 23:31:12 浏览:120
电脑网络配置怎么调最好 发布:2024-10-10 23:31:01 浏览:833
甘肃机架式存储服务器机箱厂 发布:2024-10-10 23:25:26 浏览:348
油泵房配置哪些消防系统 发布:2024-10-10 23:23:59 浏览:953
pcl如何创造有mods服务器 发布:2024-10-10 23:16:18 浏览:855