什么是树的层次遍历 要求通俗易懂

作者&投稿:别泡 (若有异议请与网页底部的电邮联系)
什么叫按层次遍历一棵树?~

类似搜索算法中的广搜,与深搜相对应。
层次遍历就是一层一层的遍历。一般可以用队列来实现。
while(队列不为空)
{
取队首节点,并将其在队列中删除
并将该节点的所有子节点放入队列(如果有的话)
}

思路就是
step1:设队空,根入队
step2:去队首元素输出,并且该元素的左右孩子依次进队
step3:重复2直至队空
#include
#include
#define NULL 0
typedef struct node
{
int data;
node *left;
node *right;
}node;


node *CreateTree(int *pre,int *in,int n)
{
if(n==0)
return NULL;
node *root;
root=(node *)malloc(sizeof(node));
root->data=pre[0];
int i=0;
while(in[i]!=pre[0])
i++;
root->left=CreateTree(pre+1,in,i);
root->right=CreateTree(pre+i+1,in+i+1,n-i-1);
return root;
}
void levelprint(node* root)
{
node* q[100];
node* t;
int i=0,j=0;
if(root!=NULL)
q[i++]=root;
while(j<i)
{
t=q[j++];
printf("%d ",t->data);
if(t->left!=NULL)
q[i++]=t->left;
if(t->right!=NULL)
q[i++]=t->right;
}
}


void main()
{
int n,pre[20],in[20],post[20],i;
printf("type in the number of the node of the tree
");
scanf("%d",&n);
printf("type in the pre order of the tree
");
for(i=0;i<n;i++)
scanf("%d",&pre[i]);
printf("type in the inorder of the tree
");
for(i=0;i<n;i++)
scanf("%d",&in[i]);
node *root;
root=CreateTree(pre,in,n);
levelprint(root);


}

二叉树的层次遍历是指从二叉树的第一层(根节点)开始,从上至下逐层遍历,在同一层中,则按照从左到右的顺序对节点逐个访问。在逐层遍历过程中,按从顶层到底层的次序访问树中元素,在同一层中,从左到右进行访问。

其思想为:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。在进行层次遍历的时候,设置一个队列结构,遍历从二叉树的根节点开始,首先将根节点指针入队列,然后从队头取出一个元素,每取一个元素,执行下面两个操作:

1、访问该元素所指向的节点。

2、若该元素所指节点的左右孩子节点非空,则将该元素所指节点的左孩子指针和右孩子指针顺序入队。此过程不断进行,当队列为空时,二叉树的层次遍历结束。

扩展资料

由于遍历中所使用的数据结构是一个队列而不是栈,因此写一个按层遍历的递归程序很困难。如下程序用来对二叉树进行逐层遍历,它采用了队列数据结构。队列中的元素指向二叉树节点。当然,也可以采用公式化队列。

程序中,仅当树非空时,才进入w h i l e循环。首先访问根节点,然后把其子节点加到队列中。当队列添加操作失败时,由Add引发NoMem异常,由于没有捕获该异常,因此当异常发生时函数将退出。在把t的子节点加入队列后,要从队列中删除t元素。

参考资料来源:百度百科-逐层遍历



就是按层(深度)遍历整棵树。

如果层次遍历这棵树,得到的序列就是12345678,遍历时因为要一层一层的下来,所以一般用广度优先遍历。

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。

设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有三种情况:DLR(称为先根次序遍历),LDR(称为中根次序遍历),LRD (称为后根次序遍历)。

扩展资料:

二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量。

给定N个节点,能构成h(N)种不同的二叉树。h(N)为卡特兰数的第N项。h(n)=C(2*n,n)/(n+1)。

设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i。

参考资料来源:百度百科——二叉树



就是按层(深度)遍历整棵树。画个图吧。

如果层次遍历这棵树,得到的序列就是12345678,遍历时因为要一层一层的下来,所以一般用广度优先遍历。



二叉树
在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的(i-1)次方个结点;深度为k的二叉树至多有2k次 − 1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。

树和二叉树的2个主要差别:

1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;

2. 树的结点无左、右之分,而二叉树的结点有左、右之分。……

树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。树在计算机领域中也得到广泛应用,如在编译源程序如下时,可用树表示源源程序如下的语法结构。又如在数据库系统中,树型结构也是信息的重要组织形式之一。一切具有层次关系的问题都可用树来描述。


感觉图是不是有些错误
1 第一层

2 3 第二层

4 5 7 第三层

6 8 第四层


宜川县18174271318: 什么是二叉树的层次遍历 -
徭战喘康: 从第一行到第N行.依次遍历 比如:12 34 5 6 7 遍历结果是:1234567

宜川县18174271318: 树的层次遍历 设计要求:对于任何一个给定的树依据其层次关系从上到下(层次之间),从左到右(同一层内) -
徭战喘康: 思路就是 step1:设队空,根入队 step2:去队首元素输出,并且该元素的左右孩子依次进队 step3:重复2直至队空#include#include#define NULL 0 typedef struct node { int data; node *left; node *right; }node; node *CreateTree(int *pre,int *in,int n...

宜川县18174271318: c++ 树的层次遍历
徭战喘康: 其实层次遍历就是图的广度遍历,只不过不需要设置标志罢了,给你一个伪算法:void Traversal(BiTree *T)[ if(!T) return ; printf("%d",T-&gt;data); EnQueue(&amp;Q,T); //T进队 while(!EmptyQueue(&amp;Q)) { DeQueue(&amp;Q,T); if(T-&gt;Lchild...

宜川县18174271318: 二叉树遍历结合例子具体讲解例子不能太简单 -
徭战喘康: 遍历的方法有:层序遍历、先序遍历、中序遍历、后序遍历等,以下面的二叉树为例介绍遍历E/ \B F/ \ \A D H/ / \C G I\K/J 1.层序遍历即从上到下按层次访问该树,每一层单独输出一行,每一层要求访问的顺序为从左到右.例子中...

宜川县18174271318: 二叉树的层次遍历 -
徭战喘康: 设计一个算法层序遍历二叉树(同一层从左到右访问).思想:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历. void HierarchyBiTree(BiTree Root){ LinkQueue *Q; // 保存当前节点的左右孩子的队列 InitQueue(Q); // 初始化队列 ...

宜川县18174271318: C语言编程 树的层次遍历 -
徭战喘康: 按层遍历吗??void anceng(Bnode *p) //按层遍历 { Bnode *q = p; Bnode *s[20]; int front = 0; int rear = 0; if(q != NULL) { rear++; s[rear] = q; } while(rear != front) { front++; p = s[front]; printf("%d\n",p->elem); if(p->lch != NULL) { rear++; s[rear] = p->lch; } if(p->rch != NULL) { rear++; s[rear] = p->rch; } } }

宜川县18174271318: 试用文字表达按照层次遍历二叉树的思想.
徭战喘康:二叉树的遍历 遍历概念 所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的操作依赖于具体的应用问题. 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础. 遍历方...

宜川县18174271318: 数据结构 树的层次遍历ABCDEFG HIJ中序遍历DBGEHJACIF,怎么画出树的图,有无方法 -
徭战喘康: 两种遍历顺序要结合着分析,才能画出这颗树的图 比如,层次遍历,先访问到A节点,说明A是树的根节点 那么在中序遍历结果里看:DBGEHJ在A前面,说明这些节点,都在A左子树上 CIF在A的后面,说这些节点,都在A的右子树上 那么,树...

宜川县18174271318: 试用文字表达按照层次遍历二叉树的思想. -
徭战喘康: 所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问.访问结点所做的操作依赖于具体的应用问 题. 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础.遍历方案二叉树的前序遍历 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次序执行三个操作:⑴访问结点本身(N),⑵遍历该结点的左子树(L),⑶遍历该结点的右子树(R).以上三种操作有六种执行次序:NLR、LNR、LRN、NRL、RNL、RLN.注意:前三种次序与后三种次序对称,故只讨论先左后右的前三种次序.

宜川县18174271318: 二叉树层序遍历的问题 -
徭战喘康: 这就是一个最简单的二叉树层次遍历,利用队列和循环.思路是:先将根节点入队,然后每次从队头取结点进行访问,每次访问就做4件事1:出队(以便后续访问队头时,访问接下来的点,做到不重复)2:输出该节点的数据(实际上就是访问的具体事物逻辑)3:将该节点的左孩子入队4:将该节点的右孩子入队 这样,当队列为空时,整个二叉树就遍历完了,而且是按照层次顺序的,层数越小越先被访问.另外同一个结点的左孩子也比右孩子先访问到.要理解队列的作用,先进先出的缓存机制.当我访问到当前层,将他的两个孩子加入队列排队,这样就能保证层次有序了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网