导航:首页 > 源码编译 > 中序遍历线索二叉树非递归算法

中序遍历线索二叉树非递归算法

发布时间:2024-06-09 23:45:39

1. 建立二叉树,层序、先序、中序、后序遍历( 用递归或非递归的方法都需要)以及中序线索化

#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define Max 20 //结点的最大个数typedef struct node{
char data;
struct node *lchild,*rchild;
}BinTNode; //自定义二叉树的结点类型typedef BinTNode *BinTree; //定义二叉树的指针int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数
//==========基于先序遍历算法创建二叉树==============
//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========
BinTree CreatBinTree(void)
{
BinTree T;
char ch;
if((ch=getchar())=='#')
return(NULL); //读入#,返回空指针
else{
T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点
T->data=ch;
T->lchild=CreatBinTree(); //构造左子树
T->rchild=CreatBinTree(); //构造右子树
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 root;
int i,depth;
printf("\n");
printf("Creat Bin_Tree;Input preorder:"); //输入完全二叉树的先序序列,
// 用#代表虚结点,如ABD###CE##F##
root=CreatBinTree(); //创建二叉树,返回根结点
//do { //从菜单中选择遍历方式,输入序号。
printf("\t********** select ************\n");
printf("\t1: Preorder Traversal\n");
printf("\t2: Iorder Traversal\n");
printf("\t3: Postorder traversal\n");
printf("\t4: PostTreeDepth,Node number,Leaf number\n");
printf("\t5: Level Depth\n"); //按层次遍历之前,先选择4,求出该树的结点数。
printf("\t0: Exit\n");
printf("\t*******************************\n");
do { //从菜单中选择遍历方式,输入序号。
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("BinTree Depth=%d BinTree Node number=%d",depth,NodeNum);
printf(" BinTree Leaf number=%d",leaf);
break;
case 5: printf("LevePrint Bin_Tree: ");
Levelorder(root); //按层次遍历
break;
default: exit(1);
}
printf("\n");
} while(i!=0);
}

2. 数据结构考试,二叉树的中序遍历的非递归算法是什么

第一题:

boolInOrderTraverse(BinNode*Node,void(*fun)(BinNode*Node))
{
StackS;//声明栈
InitBtStack(&);//初始化栈
while(!StackIsEmpty(&S)||Node)//栈空且节点为NULL是遍历完成
{
while(Node->lchild)//如果<节点左子树非空>则进栈,直到左子树为空的节点
{
Push(&S,&Node);
Node=Node->lchild;
}//while
(*fun)(Node);//访问该节点(左子树为空的节点)
Node=Node->rchlid;//转向其右子树

while(!StackIsEmpty(&S)&&!Node)//如果栈非空且右子树为空,弹出并退{//回栈顶节点,访问之,一直到右子树非空的节点
Pop(&S,&Node);
(*fun)(Node);//访问之
Node=Node->rchlid;//转向其右子树(出栈节点的左子树必然已被遍历)
}//while
}//while
DestroyStack(&S);
returntrue;
}//InOrderTraverse

第二题:

第一个while是把栈S的中的元素临时转移到栈T中,直到遇到等于e的(e出栈S但没有进栈T)。

第二个while是把栈T中的元素全部放回栈S中。

结果是:删除了S栈中<离栈顶最近,值为e>的元素。


第三题:stack


第四题:

前序串的K应该是D。


树的构型:

A

/

BF

/\

ECG

/

DHJ

I

后序序列:EDCBIHJGFA

根据后序序列易得线索:

E:lchild=NULLright=&D

C:lchild=&D

D:lchild=&Eright=&C

F:lchild=&G

H:lchild=&I

I:lchild=&Bright=&H

J:lchild=&Hright=&G

阅读全文

与中序遍历线索二叉树非递归算法相关的资料

热点内容
文本加密咋解 浏览:481
tomcat做服务器怎么设置 浏览:252
非对称加密会增大网络包吗 浏览:703
为什么不能编译c 浏览:261
数据服务器不能启动是什么意思 浏览:556
java以什么开头 浏览:820
苹果手机相册文件夹如何清理 浏览:405
服务器云电脑搭建教程 浏览:410
eco怎么搭建服务器 浏览:468
周转材料核算法 浏览:356
学nodejs还是php好 浏览:279
电信营业厅app怎么买q币 浏览:917
linux退出登陆 浏览:534
python查找相似图片的代码 浏览:336
赵丽pdf 浏览:661
如何苹果手机app不要自动更新 浏览:979
pythonflask路线教程 浏览:258
程序员职业有哪些好处 浏览:713
大都会软件app如何扫码 浏览:438
单片机0x38 浏览:758