本题应该是数这节上机题中最简单的一道,只要掌握中序遍历思想就可解决。
中序遍历算法的遍历过程是,若二叉树非空,执行以下操作:
1.中序遍历左子树。
2.访问根结点。
3.中序遍历右子树。
问题描述
输入一整数序列,建立二叉排序树,然后中序遍历。
输入说明
输入第一行为整数的个数n,第二行是具体的n个整数。
输出说明
建立二叉排序树,然后输出中序遍历的结果。
输入样例
5
1 6 5 9 8
输出样例
1 5 6 8 9
#include<stdio.h>
#include<malloc.h>
typedef struct node {
int data; //数据项
struct node* lchild, * rchild; //左右子树指针
}Bstnode;
void InOrder(Bstnode*p);
Bstnode* InsertBst(Bstnode* t, Bstnode* s);
Bstnode* CreateBst(int num);
int main(){
int num;
scanf("%d", &num);
Bstnode *tree = CreateBst(num);
InOrder(tree);
return 0;
}
void InOrder(Bstnode*p){
if(p!=NULL){
InOrder(p->lchild); //访问左子树
printf("%d ", p->data); //访问根结点
InOrder(p->rchild); //访问右子树
}
}
Bstnode* InsertBst(Bstnode* t, Bstnode* s) {
Bstnode* p, * f;
p = t;
while (p != NULL) { //目的是为了找到最后放入的位置
f = p; //用f记录下要放到的位置
if (s->data == p->data) return t; //树中已有该节点,无需插入
if (s->data < p->data) p = p->lchild; //在左子树上查找插入位置,如果根结点数值大于插入结点,就放入左子树,否则放右子树
else
p = p->rchild;
}
if (t == NULL) //原树为空,返回s作为根结点
return s;
if (s->data < f->data) //如果根结点数值大于插入结点,就放入左子树,否则放右子树
f->lchild = s;
else
f->rchild = s;
return t;
}
Bstnode* CreateBst(int num) {
Bstnode* t, * s;
int data;
t = NULL; //设置二叉排序树为空
int i = 0;
for (i; i < num; i++) {
scanf("%d", &data);
s = (Bstnode*)malloc(sizeof(Bstnode)); //分配新节点
s->lchild = s->rchild = NULL; //左右子树初始化
s->data = data;
t = InsertBst(t, s); //插入新节点
}
return t;
}
欢迎大家关注:https://github.com/XDUgaile
写完的一些东西会不定时丢上去。