博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树
阅读量:5979 次
发布时间:2019-06-20

本文共 8699 字,大约阅读时间需要 28 分钟。

#include<stdio.h>

#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define INCREASESIZE 10
#define INITSTACKSIZE 100
#define STACK_INIT_SIZE 100

typedef int Status;

typedef char ElemType;
typedef struct treenode
{
ElemType data;
struct treenode *lchild,*rchild;
}treenode,*treelink;

typedef struct {

treelink* base;
treelink* top;
int stacksize;
} SqStack;//堆栈结构体

Status createtree(treelink &T);

Status visit(ElemType e);
Status Preorder(treelink T);//递归先序遍历函数
Status Midorder(treelink T);//递归中序遍历函数
Status Lastorder(treelink T);//递归后序遍历函数,注意函数指针的使用
int getdepth(treelink T);
Status singlenode(treelink T,int &singlenum);
Status doublenode(treelink T,int &doublenum);
Status leafnode(treelink T,int &leafnum);
Status change(treelink &T);
Status Lastorder2(treelink T);//递归后序遍历函数,注意函数指针的使用
void NPostOrder(treelink T);
int Count_Sigle(treelink T) ;

Status search_x(treelink &T,ElemType x);

void CreateBiTree(treelink &root);
void insert(treelink &T,ElemType x);
Status InitStack (SqStack &s);
//建立堆栈结构

Status GetTop(SqStack s, treelink &e);

//得到堆栈头

Status Pop (SqStack &s, treelink &e);

//出堆栈

Status Push (SqStack &s, treelink e);

//入堆栈

Status StackEmpty(SqStack s);

//判断堆栈是否为空

 

#ifndef CCCCCCCCCCCC_C

#define CCCCCCCCCCCC_C

Status InitStack (SqStack &s);

//建立堆栈结构

Status GetTop(SqStack s, BiTree &e);

//得到堆栈头

Status Pop (SqStack &s, BiTree &e);

//出堆栈

Status Push (SqStack &s, BiTree e);

//入堆栈

Status StackEmpty(SqStack s);

//判断堆栈是否为空

#endif

 

 

#include "head.h"

Status InitStack (SqStack &s)
{
s.base=(treelink *)malloc(STACK_INIT_SIZE * sizeof (treelink));
if (!s.base) return ERROR;//存储分配失败
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return OK;
}

Status GetTop(SqStack s, treelink &e)

{ //if (s.top == s.base)return ERROR;
e = *(s.top-1);
return OK;
} /* GetTop */

Status Pop (SqStack &s, treelink &e) {

// 若栈不空,则删除S的栈顶元素,
// 用e返回其值,并返回OK;
// 否则返回ERROR
// if (s.top == s.base) return ERROR;
--s.top;
e = *(s.top);
//- -S.top;e=*S.top;
return OK;
}

Status Push (SqStack &s, treelink e) {

/* if (s.top - s.base >= s.stacksize) {//栈满,追加存储空间
s.base = (BiTree *) realloc ( s.base,
(s.stacksize + STACKINCREMENT) * sizeof (BiTNode));
if (!s.base) return (OVERFLOW); //存储分配失败
s.top = s.base + s.stacksize;
s.stacksize += STACKINCREMENT;
} */
*s.top = e; //*S.top=e;S.top++;
s.top++;
return OK;
}

Status StackEmpty(SqStack s)

{
if (s.base == s.top) return OK;
return ERROR;
}

 

 

#include "head.h"

/******************************/

/*利用先序递归的思想建立一个二叉树*/
/******************************/

Status createtree(treelink &T)

{
char c;
c=getchar();
if(c=='#')
T=NULL;
else
{
if(!(T=(treelink)malloc(sizeof(treenode))))
exit(OVERFLOW);
T->data=c;
createtree(T->lchild);
createtree(T->rchild);
}
return OK;
}

/******************************/

/*二叉排序树的创建算法*/
/******************************/
void CreateBiTree(treelink &root){
ElemType x;
root=NULL;
getchar();
scanf("%c",&x);
while (x!='#'){
insert(root,x);
scanf("%c",&x);
}//while
}//CreateBiTree

/******************************/

/*二叉排序树的插入算法*/
/******************************/

void insert(treelink &T,ElemType x){

if (T==NULL){ T=(treelink)malloc(sizeof(treenode));
T->data=x;
T->lchild=T->rchild=NULL;
}
else{
if (x<T->data) insert(T->lchild,x);
if (x>T->data) insert(T->rchild,x);
}
}//insert

/******************************/

/*查询是否有值为x的结点*/
/******************************/
Status search_x(treelink &T,ElemType x)
{ if(!T) return 0;
else
{
if(T->data ==x)
return OK;
else {
if(x<T->data ) search_x(T->lchild ,x);
else search_x(T->rchild ,x);
}
}

}

/******************************/
/*输出节点函数*/
/******************************/
Status visit(ElemType e)
{
printf("%c ",e);
return OK;
}
/******************************/
/*递归实现的先序遍历*/
/******************************/
Status Preorder(treelink T)//递归先序遍历函数
{
if(T)
{
visit(T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}

return OK;

}
/******************************/
/*递归实现的中序遍历*/
/******************************/
Status Midorder(treelink T)//递归中序遍历函数
{
if(T)
{
Midorder(T->lchild);
visit(T->data);
Midorder(T->rchild);
}

return OK;

}
/******************************/
/*递归实现的后序遍历*/
/******************************/
Status Lastorder(treelink T)//递归后序遍历函数,注意函数指针的使用
{
if(T)
{
Lastorder(T->lchild);
Lastorder(T->rchild);
visit(T->data);
}

return OK;

}

/******************************/

/*求树的深度(后序递归思想)*/
/******************************/
int getdepth(treelink T)
{
int lh,rh,h;
if(T==NULL)
h=0;
else
{
lh=getdepth(T->lchild);
rh=getdepth(T->rchild);
if(lh>=rh) h=lh+1;
else h=rh+1;
}
return h;
}
/******************************/
/*输出树的单分支节点(先序递归思想)*/
/******************************/
Status singlenode(treelink T,int &singlenum)
{
if((T->lchild!=NULL&&T->rchild==NULL)||(T->lchild==NULL&&T->rchild!=NULL))
{
visit(T->data);
singlenum++;
}
if(T->lchild!=NULL)
singlenode(T->lchild,singlenum);
if(T->rchild!=NULL)
singlenode(T->rchild,singlenum);
return OK;
}

int Count_Sigle(treelink T) {

//统计单分支结点的数目
int num;
if (T==NULL) return 0; //空树

else{

if (!T->lchild || !T->rchild) //只有左单分支
{num=1;
num+=Count_Sigle(T->lchild);
num+=Count_Sigle(T->rchild);
}
else
num=Count_Sigle(T->lchild)+Count_Sigle(T->rchild);//双分支结点
return num;
}
}
/******************************/
/*输出树的双分支节点(先序递归思想)*/
/******************************/
Status doublenode(treelink T,int &doublenum)
{
if(T->lchild!=NULL&&T->rchild!=NULL)
{
visit(T->data);
doublenum++;
}
if(T->lchild!=NULL)
doublenode(T->lchild,doublenum);
if(T->rchild!=NULL)
doublenode(T->rchild,doublenum);
return OK;
}
/******************************/
/*统计二叉树的叶子结点数(先序递归思想)*/
/******************************/
Status leafnode(treelink T,int &leafnum)
{
if((T->lchild==NULL&&T->rchild==NULL))
{
visit(T->data);
leafnum++;
}
if(T->lchild!=NULL)
leafnode(T->lchild,leafnum);
if(T->rchild!=NULL)
leafnode(T->rchild,leafnum);
return OK;
}
/******************************/
/*交换左右子树(后序递归)*/
/******************************/
Status change(treelink &T)
{
treelink temp;
if(T)
{
change(T->lchild);
change(T->rchild);
temp=T->lchild;T->lchild=T->rchild;T->rchild=temp;
}
return OK;
}
/******************************/
/*非递归实现的后序遍历*/
/******************************/
Status Lastorder2(treelink T)//递归后序遍历函数,注意函数指针的使用
{
SqStack S;
InitStack(S);
Push(S,T);
treelink P=NULL;
while(!StackEmpty(S))
{
if(T&&T!=P) //T!=P的意思为T是刚刚访问的根节点,证明T无右子树
{Push(S,T);T=T->lchild;}
else
{
Pop(S,T);
if(!StackEmpty(S))
if(T->rchild&&T->rchild!=P)//T->rchild!=P意思为右子树不为刚才的根节点
{Push(S,T);T=T->rchild;}
else
{visit(T->data);P=T;}
}

}

return OK;
}

void NPostOrder(treelink T)

{//后序遍历非递归算法,s为存储二叉树结点指针栈
SqStack S;
InitStack(S);
treelink p = T;
treelink pnow = T; //pnow当前访问的结点
while (p||!StackEmpty(S))
{
while (p != NULL)
{
Push(S,p);
p = p->lchild;
}
if (!StackEmpty(S))
{
treelink temp;
GetTop(S,temp);
temp = temp->rchild;
if (temp == NULL || temp == pnow) //temp==pnow的意思即当前结点为刚刚访问的结点,即其右孩子已

//经访问过了,则不往右分支走,弹栈操作

{
Pop(S,p);
visit(p->data);
pnow = p; //每访问一个结点,将指针pnow指向它
p = NULL; //每访问一个结点,将p置为NULL,即P的左分支已经走完,下一次不会

//向左分支走 while(p!=NULL)

}
else
{
p = temp;
}
}
}//while
}

 

 

#include"head.h"

 

void main()
{
int leafnum=0,singlenum=0,doublenum=0;
int x;char c;
treelink T;
printf("What do you want to do?\n");
printf("Press 1 to creat a piece of tree.\n");
printf("Press 2 to traverse in preview.\n");
printf("Press 3 to traverse in order.\n");
printf("Press 4 to traverse in last.\n");
printf("Press 5 to get the length of this tree.\n");
printf("Press 6 to get the node which has only a node.\n");
printf("Press 7 to get the node which has two nodes.\n");
printf("Press 8 to get the node which has no nodes.\n");
printf("Press 9 to change lchild and rchild.\n");
printf("Press 10 to 后序非递归遍历.\n");
printf("Press 11 to search x\n");
printf("Press 12 to 创建二叉排序树 \n");

printf("Press 0 to exit this program.\n\n");

printf("Please choose one:");
scanf("%d",&x);
while(x!=0)
{
switch(x)
{
case 1:
c=getchar();
printf("%c",c);
createtree(T);
break;
case 2:
Preorder(T);
printf("\n");
break;
case 3:
Midorder(T);
printf("\n");
break;
case 4:
Lastorder(T);
printf("\n");
break;
case 5:
printf("The depth is %d",getdepth(T));
printf("\n");
break;
case 6:
//singlenode(T,singlenum);
printf("\nThe single number is: %d", Count_Sigle( T));
printf("\n");
break;
case 7:
doublenode(T,doublenum);
printf("\nThe double number is: %d",doublenum);
printf("\n");
break;
case 8:
leafnode(T,leafnum);
printf("\nThe leaf number is: %d",leafnum);
printf("\n");
break;
case 9:
change(T);
break;
case 10: NPostOrder(T);
printf("\n");
break;
case 11: getchar();
printf("\n input search x:");
scanf("%c",&x);
printf("\n%d",search_x(T,x));
break;
case 12: CreateBiTree(T);
break;

}

printf("Please choose one:");
scanf("%d",&x);
}
printf("\n Thank you for viewing this program.\n");

}

 

转载于:https://www.cnblogs.com/ur10ser/p/7928385.html

你可能感兴趣的文章
Netbeans8的maven配置文件路径
查看>>
#define和const的区别
查看>>
一个北京妞儿写给所有的女人的信
查看>>
git 下载并部署web应用
查看>>
tomcat加载web.xml的顺序
查看>>
DBTileButton
查看>>
php中heredoc的使用方法
查看>>
区分Oracle和SQL Server常用函数
查看>>
根据中国气象网xml数据返回天气预报
查看>>
OpenCart之特色分类模块
查看>>
成为Java GC专家系列(3) — 如何优化Java垃圾回收机制
查看>>
使用 ftrace 调试 Linux 内核,第 1 部分
查看>>
javascript 笔记之作用域
查看>>
Avro 模式演化与排序
查看>>
【16】万魂杀服务器开发之bug相关
查看>>
js操作html的table,包括添加行,添加列,删除行,删除列,合并列
查看>>
chromium 下载地址
查看>>
PHP mkdir() 权限设置
查看>>
constructor / destructor
查看>>
Spring整合Hessian访问远程服务
查看>>