XDOJ-274 中序遍历二叉排序树

本题应该是数这节上机题中最简单的一道,只要掌握中序遍历思想就可解决。

中序遍历算法的遍历过程是,若二叉树非空,执行以下操作:

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

写完的一些东西会不定时丢上去。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值