二叉树的创建和遍历
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的创建和遍历相关的知识,希望对你有一定的参考价值。
创建一个三层的二叉树,对所有的支叶进行赋值。
使用深度优先遍历算法遍历二叉树,并将结果输出。
使用广度优先遍历算法遍历二叉树,并将结果输出。
要求:用C语言编写,并有详细注释。
#include "stdio.h"
#include "malloc.h"
#include "string.h"
#include "stdlib.h"
#define Max 20 //结点的最大个数
typedef struct BinTNode
char data;
struct BinTNode *lchild,*rchild;
BinTNode,*BinTree; //自定义二叉树的结点类型
//定义二叉树的指针
int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数
//==========以广义表显示二叉树==============
void DisTree(BinTree T)
if(T)
printf("%c",T->data);
if((T->lchild)||(T->rchild))
if(T->lchild)
printf("%c",'(');
DisTree(T->lchild);
if(T->rchild)
printf("%c",',');
DisTree(T->rchild);
printf("%c",')');
//==========基于先序遍历算法创建二叉树==============
//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========
BinTree CreatBinTree(BinTree T)
char ch;
ch=getchar();
if(ch=='#')
T=NULL;
else
if(!(T=(BinTNode *)malloc(sizeof(BinTNode))))
printf("Error!");
T->data=ch;
T->lchild=CreatBinTree(T->lchild);
T->rchild=CreatBinTree(T->rchild);
return T;
//========NLR 先序遍历=============
void Preorder(BinTree T)
if(T)
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
//========LNR 中序遍历===============
void Inorder(BinTree T)
if(T)
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
//==========LRN 后序遍历============
void Postorder(BinTree T)
if(T)
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========
int TreeDepth(BinTree T)
int hl,hr,max;
if(T)
hl=TreeDepth(T->lchild); //求左深度
hr=TreeDepth(T->rchild); //求右深度
max=hl>hr? hl:hr; //取左右深度的最大值
NodeNum=NodeNum+1; //求结点数
if(hl==0&&hr==0)
leaf=leaf+1; //若左右深度为0,即为叶子。
return(max+1);
else return(0);
//====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========
void Levelorder(BinTree T)
int front=0,rear=1;
BinTNode *cq[Max],*p; //定义结点的指针数组cq
cq[1]=T; //根入队
while(front!=rear)
front=(front+1)%NodeNum;
p=cq[front]; //出队
printf("%c",p->data); //出队,输出结点的值
if(p->lchild!=NULL)
rear=(rear+1)%NodeNum;
cq[rear]=p->lchild; //左子树入队
if(p->rchild!=NULL)
rear=(rear+1)%NodeNum;
cq[rear]=p->rchild; //右子树入队
//==========主函数=================
void main()
BinTree T,root;
int i,depth;
printf("\n");
printf("输入完全二叉树的先序序列:"); //输入完全二叉树的先序序列,
// 用#代表虚结点,如ABD###CE##F##
root=CreatBinTree(T); //创建二叉树,返回根结点
DisTree(root);
printf("\n");
do //从菜单中选择遍历方式,输入序号。
printf("\t********** 菜单 ************\n");
printf("\n");
printf("\t1: 先序遍历\n");
printf("\t2: 中序遍历\n");
printf("\t3: 后序遍历\n");
printf("\t4: 该树的深度,结点数,叶子数\n");
printf("\t5: 层次遍历\n"); //按层次遍历之前,先选择4,求出该树的结点数。
printf("\t0: 退出\n");
printf("\t*******************************\n");
scanf("%d",&i);
//输入菜单序号(0-5)
switch(i)
case 1: printf("Print Bin_tree Preorder: ");
Preorder(root); //先序遍历
break;
case 2: printf("Print Bin_Tree Inorder: ");
Inorder(root); //中序遍历
break;
case 3: printf("Print Bin_Tree Postorder: ");
Postorder(root); //后序遍历
break;
case 4: depth=TreeDepth(root); //求树的深度及叶子数
printf("树深=%d 树总结点数=%d",depth,NodeNum);
printf(" 树叶子数=%d",leaf);
break;
case 5: printf("LevePrint Bin_Tree: ");
Levelorder(root); //按层次遍历
break;
default: exit(1);
while(i>=0&&i<6);
兄弟你看看 不懂再往下留言 记得给我的劳动成果一点点奖励哦!!本回答被提问者和网友采纳
Python 二叉树的创建和遍历、重建
参考技术A 几个有限元素的集合,该集合为空或者由一个根(Root)的元素及两不相交的(左子树和右子树)的二叉树组成,是有序树,当集合为空时,称为空二叉树,在二叉树中,一个元素也称为一个结点。前序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树
中序遍历:若树为空,则空操作返回,否则从根结点开始(不是先访问根结点),中序遍历根结点的左子树,然后访问根节点,最后中序遍历右子树。
后序遍历:若树为空,则空操作返回,否则从左到右先访问叶子结点后结点的方式遍历左右子树,最后访问根节点。
层序遍历:若树为空,则空操作返回,否则从树的每一层,即从根节点开始访问,从上到下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。
假设已知后序遍历和中序遍历结果,从后序遍历的结果可以等到最后一个访问的结点是根节点,对于最简单的二叉树,此时在中序遍历中找到根节点之后,可以分辨出左右子树,这样就可以重建出这个最简单的二叉树了。而对于更为复杂的二叉树,重建得到根结点和暂时混乱的左右结点,通过递归将左右结点依次重建为子二叉树,即可完成整个二叉树的重建。(在得到根结点之后,需要在中序遍历序列中寻找根结点的位置,并将中序序列拆分为左右部分,所以要求序列中不能有相同的数字,这是序列重建为二叉树的前提。)
Root =None
strs="abc##d##e##" #前序遍历扩展的二叉树序列
vals =list(strs)
Roots=Create_Tree(Root,vals)#Roots就是我们要的二叉树的根节点。
print(Roots)
inorderSearch = inOrderTraverse2(Roots)
print(inorderSearch)
以上是关于二叉树的创建和遍历的主要内容,如果未能解决你的问题,请参考以下文章
c++如何用非递归的算法去创建二叉树,有没有分层建立二叉树的方法
二叉树有关习题整理543二叉树的直径 606根据二叉树创建字符串 KY11二叉树遍历 - 牛客105从前序遍历与中序遍历构造二叉树