欢迎进入@shuai:二叉树2;
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
#include<stdio.h>
#include<stdlib.h>
#define size 100
typedef struct tree{
int data;
struct tree *l,*r;
}tree;
tree * isno(){
int n;
tree*bt;
bt=(tree*)malloc(sizeof(tree));
printf("请输入根节点(0表示空)");
scanf("%d",&n);
if(n==0){
printf("此树为空");
exit(0);
}
else{
bt->data=n;
bt->l=0;
bt->r=0;
printf("根为%d的树建立成功\n",n);
}
return bt;
}
creat(tree *bt){
tree *node;
int n;
printf("请输入%d节点的左孩子\n",bt->data);
scanf("%d",&n);
if(n!=0){
node=(tree*)malloc(sizeof(tree));
node->data=n;
node->l=0;
node->r=0;
bt->l=node;
creat(bt->l);
}
printf("请输入节点为%d的右孩子\n",bt->data);
scanf("%d",&n);
if(n!=0){
node=(tree*)malloc(sizeof(tree));
node->data=n;
node->l=0;
node->r=0;
bt->r=node;
creat(bt->r);
}
return 0;
}
print(tree *bt){
if(bt){
printf("%d",bt->data);//先序输出
print(bt->l);
// printf("%d",bt->data);//中序输出
print(bt->r);
// printf("%d",bt->data);//后序输出
}
}
printcen(tree *bt){
tree **q;
tree *p;
int front,rear;
q=(tree**)malloc(size*sizeof(tree*));
front=0,rear=0;
rear=(rear+1)%size;
q[rear]=bt;
while(front!=rear){
front=(front+1)%size;
p=q[front];
printf("%d ",p->data);
if(p->l){
rear=(rear+1)%size;
q[rear]=p->l;
}
if(p->r){
rear=(rear+1)%size;
q[rear]=p->r;
}
}
free(q);
}
main()
{
tree *bt;
bt=isno();
creat(bt);
print(bt);
printcen(bt);
}
1.二叉搜索树的建立以及输出QAAQ,
2.typedef struct tree{
int data;
struct *left;
struct right;
}tree;
用形如这样的结构体来定义树的节点,left指向下一级,right指向同级
3.有些函数返回值要注意一下(上述代码中的isno就是这样),可能要返回一个节点,这是应该用tree
4.先序输出,中序输出,后序输出分别对应着第一,二,三次遇到这个节点时是否输出,如图,
对于每个节点都会有三次经过的机会,三次中可以选择是否输出,
5.按层输出这用到了队列先入先出的特点( 不久的将来会复习队列的时候会写博客呦)
https://baike.baidu.com/item/队列/14580481?fr=aladdin
遇到节点入队,然后他的左右儿子入队,然后依次出队就好(),
6. 加油努力鸭!QAQ “ ---- “
相关题目:
数字统计:https://www.luogu.org/problemnew/show/P1179
最小生成树:https://www.luogu.org/problemnew/show/P3366
亲戚:https://www.luogu.org/problemnew/show/P1551
发现错误,疑惑不解,联系作者:1939096278@qq.com
欢迎联系呦 -------- QAQ ---------;