二叉排序树相关操作(C/C++)

本文详细介绍了如何使用非递归方法创建和遍历二叉排序树,包括递归创建、非递归创建以及非递归的前序、中序和后序遍历算法,利用栈实现了各遍历过程。
摘要由CSDN通过智能技术生成

目录:
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(栈不空)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值