首页 > 编程知识 正文

二叉树层次遍历c++语言,二叉树层序遍历c++

时间:2023-05-04 20:31:00 阅读:34418 作者:605

c语言:二叉树中序遍历

标签:在c语言二叉树中依次扫描

by小威

这周作业的主题是关于二叉树的中顺扫描。 中顺扫描是先读左子树,然后读根节点,最后读右子树。 主题的意思是,先输出左子树,再输出根节点,最后输出右子树。

主题如下:

利用链表实现二叉树结构,完成中序遍历。

首先,在头文件中定义节点结构:

类型定义结构节点{

int x;

结构节点*左;

结构节点*权限;

(bn;

接下来为了实现两个函数,函数buildTree通过读取一系列的整数来构建二叉树,使层次优先从左到右,函数outputTree输出该树的中序扫描。 两个函数的原型如下:

语音下载(bn * *根ptr );

voidoutputtree(bn*root;

输入: n个正整数,1=N=30,用空格分隔,以-1结尾。 注意-1不包含在此树的结构中,仅用作输入的结尾符号。

输出:行遍历以空格分隔的正整数。 最后输出的元素后面有空格,没有换行符

注意: main函数已经给出,其中给出了指向树根节点的指针和整树free的过程。 buildTree函数中的所有节点都是以malloc格式生成的,如果一个节点没有左儿子或右儿子,则相应的指针应该等于NULL。

Sample:

input:

1 2 3 4 5 6 7 8 9 -1

output :

8 4 9 2 5 1 6 3 7

主题的难点是以层次优先的方式从左到右依次构建子树。 我知道可以利用递归创建子树,但不能做这个问题。 因为这个问题显然是从左到右造成的。 我该怎么办?

那就是用队列的思想制作子树。 简单来说,将每个节点的位置保存为一个数组,然后按顺序处理数组中的元素就是处理每个节点。 为每个节点打开两个子树。 要从左向右打开,请优先选择层次结构,将从左到右节点的地址顺序存储在数组中,然后在一个循环中遍历数组以创建子树。 清空的思想也是如此,总之这个问题全身都是宝啊。

另一个难点是双重指针! 请注意,必须在函数中使用双重指针操作根节点。 否则,在函数内所做的一切都是徒劳的! 要在函数中打开其他子树,只需要使用一个指针,但这样生成的子树与根节点分离。 必须将根节点连接到其子树。 因此,在根节点上打开空间,用双重指针给根节点分配值,将根节点的地址发送到数组中。

接下来是我的代码:

/*main.c*/

#包含

#包含

#包含

#include'tree.h '

#define MAXI 50

int main () )。

bn*路线;

BN* que[MAXI];/*使用for free * /

int head=0;/* OFF * /

int tail=1; /*tail of que*/

构建树(根);

输出树(根);

/*the free procedure*/

que[0]=根;

wile (头!=tail ) {

if(que[head]-left!=空) {

que[tail]=que[head]-left;

tail=(tail1) % MAXI;

}

if(que[head]-right!=空) {

que[tail]=que[head]-right;

tail=(tail1) % MAXI;

}

free(que[head];

head=(head1) % MAXI;

}

返回0;

}

/*tree.h*/

#包含

#包含

#define MAXI 50

类型定义结构节点{

int x;

结构节点*左;

结构节点*权限;

(bn;

voidbuildtree (bn * *根ptr ) {

BN* p1;

BN* a[MAXI];

*rootptr=malloc(sizeof(bn );

a[0]=*根ptr;

int head=0;

int tail=1;

扫描(' % d ),(*rootptr )-x );

(*根ptr )-left=NULL;

(*根ptr )-right=NULL;

wile(1) {

int val;

扫描(' % d ',val );

if(val==-1 ) {

布雷克;

} else {

P1=malloc(sizeof ) bn );

p1-x=val;

a[tail]=p1;

tail=(tail1) % MAXI;

a[head]-left=p1;

p1-left=NULL;

p1-right=NULL;

}

扫描(' % d ',val );

if(val==-1 ) {

布雷克;

} else {

P1=malloc(sizeof ) bn );

p1-x=val;

a[tail]=p1;

tail=(tail1) % MAXI;

a[head]-right=p1;

p1-left=NULL;

p1-right=NULL;

}

head=(head1) % MAXI;

}

}

voidoutputtree(bn*root ) {

bn*P1=路线;

if(P1==null ) {

返回;

}

输出树(P1-left );

printf('%d ',p1-x );

输出树(P1-right );

}

以上内容都是本人的观点,欢迎大家批评和指导,我们一起探讨!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。