“二叉排序树”的定义(也叫“二叉搜索树”):
二叉排序树是一颗特殊的二叉树,其上的数值>=其左子树上的任意结点数值,<=其右子树上任意结点的数值。
若对二叉排序树进行中序遍历,那么其遍历结果必然是一个递增序列,这也是二叉排序树名字的来由,通过建立二叉排序树就能对原无序序列进行排序,并实现动态维护。
因此,根据定义来进行编程实现二叉排序树。其实对于要插入的一个数,找到它应该在的位置==创建它应该在的结点。
二叉排序树的插入,模板代码:
void insertTree(treeNode* &t, int a) //注意这里传引用&t,防止修改无效
{
if(t==NULL) //如果是空,创建该结点
{
t = new treeNode(a);
}
else if(t->val>a) //a应该在左子树
{
insertTree(t->left,a);
}
else if(t->val<a)//a应该在右子树
{
insertTree(t->right,a);
}
}
AC代码:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
struct treeNode
{
int val;
treeNode* left;
treeNode* right;
treeNode(int x):val(x),left(NULL),right(NULL){}
};
void insertTree(treeNode* &t, int a, treeNode* father) //注意传参是传引用&t,否则主函数里root一直为空!!!
{
if(t==NULL) //如果是空,创建该结点
{
t = new treeNode(a);
if(father==NULL)
//根节点,则无父节点
cout<<-1<<endl;
else
{
//a找到(创建)了它应该在的结点位置,同时根据题意要输出father结点
cout<<father->val<<endl;
}
}
else if(t->val>a) //则a应该在左子树
{
insertTree(t->left,a,t);
}
else if(t->val<a)//应该在右子树
{
insertTree(t->right,a,t);
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
treeNode *root = NULL;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
insertTree(root,a,NULL);
}
}
return 0;
}