遍历二叉查找树

1002. 二叉查找树的遍历
 
 
Total: 111 Accepted: 73
 
     
     
 
Time Limit: 1sec    Memory Limit:256MB
Description

给定一组无序整数,以第一个元素为根节点,生成一棵二叉搜索树,对其进行中序遍历和先序遍历。

Input
输入包括多组测试数据,每组测试数据包含两行:第一行为整数m(1<=m<=3000),表示该组数据中整数的数目,第二行给出m个整数,相邻整数间用一个空格间隔。最后一组测试数据后紧跟着包含0的一行输入,标识输入的结束。
Output
每组测试数据产生两行输出,第一行是中序遍历结果,第二行是先序遍历结果,每个整数后面带一个空格(包括最后一个整数),每行中第一个整数前无空格。
Sample Input
 Copy sample input to clipboard
9
10 4 16 9 8 15 21 3 12
6
20 19 16 15 45 48
0
Sample Output
3 4 8 9 10 12 15 16 21
10 4 3 9 8 16 15 12 21
15 16 19 20 45 48
20 19 16 15 45 48
#include<iostream>
using namespace std;

struct BitNode
{
	int data;
	BitNode* lchild;
	BitNode* rchild;
};

//重建二叉查找树
void build(BitNode* T, int num)
{
	//if bigger than the root
	if(T->data>num)
	{
		if(!T->lchild)  //if no have left son
		{
			BitNode* lt=new BitNode();
			lt->data=num;
			lt->lchild=NULL;
			lt->rchild=NULL;
			T->lchild=lt;
		}
		else          // if have left son, recurise
			build(T->lchild, num);
	}
	else   //if smaller than the root
	{
		if(!T->rchild)
		{
			BitNode* rt=new BitNode();
			rt->data=num;
			rt->lchild=NULL;
			rt->rchild=NULL;
			T->rchild=rt;
		}
		else
			build(T->rchild, num);
	}
}

//前序遍历
void preorder(BitNode* T)
{
	if(T)
	{
		cout<<T->data<<" ";
		preorder(T->lchild);
		preorder(T->rchild);
	}
}

//中序遍历
void inorder(BitNode* T)
{
    if(T)
    {
    	inorder(T->lchild);
    	cout<<T->data<<" ";
        inorder(T->rchild);
    }
}

int main()
{
    int n;

    while(cin>>n&&n)
    {
    	int num;

        BitNode* T=new BitNode();
        cin>>num;
        T->data=num;
        T->lchild=NULL;
        T->rchild=NULL;
        while(--n>0)
        {
        	cin>>num;
        	build(T, num);
        }

        inorder(T);
        cout<<endl;
        preorder(T);
        cout<<endl;
    }

    return 0;
}

  

posted @ 2016-12-21 21:45  KennyRom  阅读(829)  评论(0编辑  收藏  举报