实用数据结构之二叉排序树小结

实用数据结构之二叉排序树小结:

定义:

满足以下条件的二叉树:
 对于树上任意一个结点,其上的数值必大于等于其左子树上任意结点的数值
 必小于等于其右子树上任意结点的数值

故二叉排序树的插入:

1.若当前树为空,则x为其根结点
2.若当前结点大于x,则x插入其左子树, 若当前结点小于x,则x插入其右子树
若当前结点等于x,则根据具体情况选择插入左子树或者右子树或者直接忽略


例如: 输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历
输入:
5
1 6 5 9 8
输出:
1 6 5 9 8
1 5 6 8 9
5 8 9 6 1

#include <iostream>

#include <cstring>

using namespace std;



struct Node//二叉树结点结构体

{

	Node *lchild;//左儿子指针

	Node *rchild;//右儿子指针

	int c;//结点字符信息

}Tree[110];//静态内存分配数组



int loc;//静态数组中已经分配的结点个数



Node *create()//申请一个结点空间,返回指向其的指针

{

	Tree[loc].lchild = Tree[loc].rchild = NULL;//初始化左右儿子为空

	return &Tree[loc++];//返回指针,loc自增

}



void preOrder(Node *T)//先序遍历

{

	cout<<T->c<<" ";

	if (T->lchild!=NULL)

		preOrder(T->lchild);

	if (T->rchild!=NULL)

		preOrder(T->rchild);

}

void inOrder(Node *T)//中序遍历

{

	if (T->lchild!=NULL)

		inOrder(T->lchild);

	cout<<T->c<<" ";

	if (T->rchild!=NULL)

		inOrder(T->rchild);	

}



void postOrder(Node *T)//后序遍历

{

	if (T->lchild!=NULL)

	postOrder(T->lchild);

	if (T->rchild!=NULL)

	postOrder(T->rchild);

   cout<<T->c<<" ";

}



Node* insert(Node* root,int value)

{

	if (root==NULL)//若当前树为空

	{

		root = create();

		root->c = value;

		return root;

	}

	else

		if (root->c <value)

		{

			root->rchild = insert(root->rchild,value);

		}

		else if(root->c > value)

	{

		root->lchild = insert(root->lchild,value);

	}



return root;

}



int main()

{

	int n;

	while(cin>>n)

	{

		loc = 0;

       Node *root = NULL;

	   for (int i=0;i<n;i++)

	   {

		   int value;

		   cin>>value;

		   root = insert(root,value);

	   }



		preOrder(root);

		cout<<endl;

		inOrder(root);

		cout<<endl;

		postOrder(root);

		cout<<endl;

	}

	

   // system("pause");

	return 0;

}


 

 

 

你可能感兴趣的:(二叉排序树)