树的遍历
来源:互联网 发布:孙骁骁家庭知乎 编辑:程序博客网 时间:2024/06/18 07:44
利用树的扩展先根遍历序列创建度一定的树,然后实现树的先根次序遍历、后根次序遍历,层序遍历。
在对树做任何运算之前,树本身必须存在,因此,首先必须创建树,实际上就是建立树的存储结构。
例树的扩展前序序列为"AB###C###D###",度为3,则由此建立的树的先根次序序列为:ABCD,后序序列为:BCDA,层序序列是:ABCD
此程序按层序遍历的时候使用了<queue>库
具体代码:
#include <stdio.h>
#include <sys/malloc.h>
#include <stdlib.h>
#include<iostream>
#include <string.h>
#include<queue>
using namespace std;
#define m 3
#define MAXLEN 100
typedef char datatype;
typedef struct node {
datatype data;
struct node *child[m];
} node;
typedef node *tree;
/********************************************************/
/* 函数功能:根据树的前序遍历结果建立一棵3度树 */
/* 函数返回值:树根地址 */
/* 文件名:tree.h,函数名:createtree () */
/********************************************************/
tree createtree()//按前序遍历顺序建立一棵3度树的递归算法
{
int i;
char ch;
tree t;
if ((ch=getchar())=='#')
t=NULL;
else
{
t=(tree) malloc (sizeof(node));
t->data=ch;
for (i=0;i<m;++i){
t->child[i]= createtree();
}
}
return t;
}
void preorder(tree t)
{
int i;
if (t)
{
printf("%c",t->data);
for (i=0;i<m;i++)
preorder(t->child[i]);
}
}
void postorder(tree t)
{
int i;
if (t)
{
for (i=0;i<m;i++)
postorder(t->child[i]);
printf("%c",t->data);
}
}
void levelorder(tree t)
{
if(t)
{
queue <tree> Q;
tree p;
Q.push(t);
while(!Q.empty())
{
p=Q.front();
Q.pop();
printf("%c",p->data);
for (int i=0;i<m;i++)
if(p->child[i])
Q.push(p->child[i]);
}
}
}
int main()
{
tree t;
t=createtree();
preorder(t);
printf("\n");
postorder(t);
printf("\n");
levelorder(t);
printf("\n");
return 0;
}
结果:
AB###C###D###
ABCD
BCDA
ABCD
- 二叉树的遍历(层遍历和深度遍历)
- 二叉树的前序中序后序遍历,非递归遍历 层次遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树遍历-----前序后序迭代遍历的新思路
- 二叉树的遍历-按层次遍历
- 二叉树的遍历(递归遍历)
- 二叉树的遍历-层次遍历
- 树的遍历
- 六、 树的遍历
- 二叉树的遍历
- haffman树的遍历
- 二叉树的遍历
- 树的各种遍历
- 树的遍历
- 二叉树的遍历
- C++树的遍历
- Java树的遍历
- 树的简单遍历
- 爱因斯坦提出的台阶问题
- kali2017安装中文输入法
- 什么是高并发 ,详细讲解
- 浅谈指针数组、数组指针及函数指针
- HTTP状态码
- 树的遍历
- 锚点定位
- 阿里云ssl tomcat nginx https
- 自己对JVM新生带的理解
- 加法电路原理
- new 关于java多线程 > ThreadLocal
- java包装类型 “==”的比较(Integer,long等)
- 牙膏厂效率为何如此之低
- swift