建立一棵二叉排序树

定义

二叉排序树(也称二叉查找树),或者是一棵空的二叉树,或者是具有下列性质的二叉树:
⑴ 若它的左子树不空,则左子树上所有结点的值均小于根结点的值;
⑵ 若它的右子树不空,则右子树上所有结点的值均大于根结点的值;
⑶ 它的左右子树也都是二叉排序树。
中序遍历二叉排序树可以得到一个按关键码的有序数列。

建树

脱胎于二叉树,区别是每个节点数据要进行比对,再进行插入,小插左,大插右,直接上代码,清楚明白。

#include<bits/stdc++.h>
using namespace std;
#define N 100

typedef  struct BiTNode
{
    char data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

BiTree root=NULL;
int n,k[N];

void inOrder(BiTree T)//中序遍历 
{

	if(T!=NULL)
	{
	  inOrder(T->lchild);//左 
	  printf("%d ",T->data);// 根 
	  inOrder(T->rchild);//右 
	}
}

void insert(int m)
{
	BiTree p1, p2;
	if(root==NULL)
	{
	  	root=new BiTNode;
	  	root->data=m;
	  	root->lchild=root->rchild=NULL;
	}
	else
	{
		p1=root;
		while(m!=p1->data)
		{
		    if((m<p1->data) && (p1->lchild!=NULL))
		    {
		    	p1=p1->lchild;
			}
		    else if((m>p1->data) && (p1->rchild!=NULL))
		    {
		    	p1=p1->rchild;
			}
		    else if((m<p1->data) && (p1->lchild==NULL))
		    {
		      	p2=new BiTNode;
		      	p2->data=m;
		      	p2->lchild=p2->rchild=NULL;
		      	p1->lchild=p2;
		      	return;
		    }
		    else if((m>p1->data) && (p1->rchild==NULL))
		    {
		      	p2=new BiTNode;
		      	p2->data=m;
		      	p2->lchild=p2->rchild=NULL;
		      	p1->rchild=p2;
		      	return;
		    }
		}
	}
}

void create()
{
	cout<<"输入节点数量:";
	cin>>n;
	for(int i=0; i<n; i++)
	{
		cin>>k[i];
	}
	for(int i=0; i<n; i++)
	{
		insert(k[i]);
	}
}

int main()
{
	create();
	cout<<"中序遍历输出:"<<endl; 
	inOrder(root);
	return 0;
}

你可能感兴趣的:(数据结构与算法)