树-二叉排序树(中序有序化)

二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树: 

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; 

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; 

3)左、右子树也分别为二叉排序树;

注:中序遍历二叉排序树即可得到有序序列;时间复杂度O(logn)

查找:(基本步骤)

1)若根节点的关键字等于查找元素---查找成功;

2)若根节点关键字小于查找元素---遍历右子树;

3)若根节点关键字大于查找元素---遍历左子树;

直到遍历到根节点为空时查找结束,无该元素查找失败。

树结构练习——排序二叉树的中序遍历

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值。现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果。
 

Input

输入包含多组数据,每组数据格式如下。
第一行包含一个整数n,为关键值的个数,关键值用整数表示。(n<=1000)
第二行包含n个整数,保证每个整数在int范围之内。

Output

为给定的数据建立排序二叉树,并输出其中序遍历结果,每个输出占一行。
 

Sample Input

1
2
2
1 20

Sample Output

2
1 20
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct Node{
	struct Node * left;
	struct Node * right;
	int data;
}Node;
int flag=0;
Node * Create(int n){//二叉排序树
	int flag=0;
	if(n==0){
		return NULL;
	}
	int data;
	Node * root=(Node *)malloc(sizeof(Node));//root
	scanf("%d",&data);
	root->data=data;
	root->left=NULL;
	root->right=NULL;
	for(int i=1;i<n;i++){
		scanf("%d",&data);
		Node * p=(Node *)malloc(sizeof(Node));;
		p->data=data;
		p->left=NULL;
		p->right=NULL;
		Node * q=root;
		Node * r=NULL;
		while(q){//从root开始
			if(p->data>q->data){
				r=q;
				flag=0;
				q=q->right;//插入位置
			}
			else{
				r=q;
				flag=1;
				q=q->left;//插入位置
			}
		}
		if(flag){
			r->left=p;
		}
		else{
			r->right=p;
		}
		flag=0;
	}
	return root;
}
void Order(Node * root){
	if(root){
		Order(root->left);
		if(flag==0){
		   printf("%d",root->data);
		   flag=1;
		}
		else{
			printf(" %d",root->data);
		}
		Order(root->right);
	}
}
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		Node * root=NULL;
		root=Create(n);
		Order(root);
		printf("\n");
		flag=0;
	}
	return 0;
}







猜你喜欢

转载自blog.csdn.net/m0_37848958/article/details/80166392