目录:
1、创建二叉树(递归)
2、创建二叉树(非递归)
3、前序遍历(非递归)
4、中序遍历(非递归)
5、后续遍历(非递归)
创建二叉排序树(递归)
//创建Ordertree(Bitree *&t,int data)
void Ordertree(Bitree *&t,int data){
Bitree *p=(Bitree*)malloc(sizeof(Bitree));
p->left=p->right=NULL;
if(t==NULL){
p->data=data;
t=p;
}else if(data>t->data){
Ordertree(t->right,data);
}else if(data<t->data){
Ordertree(t->left,data);
}
}
int main () {
// char *pre="ABCDEFGH";
// char *in="CBDAGFHE";
Bitree *a=NULL;//必须初始化
Ordertree(a,9);
Ordertree(a,7);
Ordertree(a,10);
Ordertree(a,3);
Ordertree(a,8);
Ordertree(a,12);
show(a);
return 0;
}
``
二叉排序树非递归创建
void addnode(BinaryT *&t,int val){
BinaryT *p=(BinaryT*)malloc(sizeof(BinaryT));
p->l=p->r=NULL;
p->data=val;
if(t==NULL){
t=p;
return;
}
BinaryT *pre=NULL,*s;
s=t;
while(s){
if(s->data==val){
printf("already exist!\n");
return;
}
if(s->data>val){
pre=s;
s=s->l;
}else{
pre=s;
s=s->r;
}
}
if(pre->data>val){
pre->l=p;
}else{
pre->r=p;
}
return;
}
前序遍历非递归算法
用栈实现,先把根节点入栈,进入while(栈不为空则继续)循环
在循环内执行{
pop出一个结点指针temp,
printf打印temp->data的值
如果(右子树不为空){
右子树进栈push
}
如果(左子树不为空)
{
左子树进栈push
}
}
因为是用栈实现的非递归前序遍历,所以先访问栈顶元素,又由于栈是后进先出,所以先进右子树,再进左子树
typedef struct Node{
char data;
struct Node *left;
struct Node *right;
}Bitree;
//||自定义栈
typedef struct sq{
Bitree *ptree[10];
int top;
}Sqstack;
bool stackempty(Sqstack *st){
return (st->top==-1);
}
//压栈操作,传入的两个参数,一个是用于接收根节点的地址Bitree *,一个是用于对原生的st进行指针赋值操作
bool push(Sqstack *st,Bitree *p){
if(st->top==9){
return 0;
}
st->top++;
st->ptree[st->top]=p;
return 1;
}
//出栈操作,一个用于接收被pop的栈顶元素,因为这个元素必须要改变指针的值,而不是指针所指向内存的值,所以用*&.
bool pop(Sqstack *st,Bitree *&p){
if(stackempty(st)){
return 0;
}
p=st->ptree[st->top];
st->top--;
return 1;
}
void preshow(Bitree *t){
Bitree *p;
//若为空树直接返回NULL
if(t==NULL){return;}
//不为空,则先进栈根节点;栈的初始化
Sqstack *st=(Sqstack *)malloc(sizeof(Sqstack));
st->top=-1;
push(st,t);
//栈不为空,则进入循环
while(!stackempty(st)){
//取栈顶元素进行输出
pop(st,p);
printf("%c ",p->data);
//左右子树不为空才进栈
if(p->right!=NULL){
push(st,p->right);
}
if(p->left!=NULL){
push(st,p->left);
}
}
}
——————————————————————————
中序遍历非递归
伪码描述:
while(栈不为空 | | p!=NULL){
while(结点p不为空){
将p进栈;
p=p->left;
}
if(栈不空){
出栈并访问;
p=p->right;
}
}
后序遍历非递归
伪码描述:
do{
while(结点p不空){
将p进栈;
p=p->left;
}
while(栈不空且结点p是栈顶){
取栈顶;
if(结点p的右子树已访问){
访问结点p,
退栈;
}
else p=p->right;
}
}while(栈不空)