SDUT 2128 树结构练习——排序二叉树的中序遍历
树结构练习——排序二叉树的中序遍历
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
提示:本题有技巧,因为根据排序二叉树的特点,比根节点小的放到其左子树,大的放到其右子树,可以看出,如果写其中序遍历,那么一定是递增序列,所以可以直接排序输出。(嘻嘻嘻不是我告诉你的
代码实现如下(g++):
#include<bits/stdc++.h> typedef struct node { int data; struct node *left; struct node *right; }node,*Tree; int n,k; void create(Tree &root,int ch) { if(root==NULL) { root=new(node); root->left=NULL; root->right=NULL; root->data=ch;//把第一个点记为根节点 } else { if(ch<root->data)//如果该点比根节点小,放到左子树 create(root->left,ch); else//否则放到右子树 create(root->right,ch); } } void iOnisort(Tree &root) { if(root) { iOnisort(root->left); if(k==1) {printf("%d",root->data); k++;} else {printf(" %d",root->data);} iOnisort(root->right); } } int main() { int n,i; Tree root; while(~scanf("%d",&n)) { k=1; root=NULL; while(n--) { scanf("%d",&i); create(root,i); } iOnisort(root); printf("\n"); } return 0; } /*************************************************** Result: Accepted Take time: 0ms Take Memory: 208KB ****************************************************/