二叉排序树(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; }