链式二叉搜索树的创建
二叉搜索树:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
1.结构体类型:
typedef struct Node{
int data;//数据域的值
struct Node *left;//左子树
struct Node *right;//右子树
}BTNode;
2.整体架构
①在for循环内创建每一个节点;
②寻找该节点应当插入的位置;
③判断新节点应当插入上一节点的左侧还是右侧,并插入;
④循环n次后,返回根节点;
3.核心代码
BTNode* CreateTree(int *Data,int n){//传入所需的数据
BTNode *p,*tail,*root,*pa;
root=(BTNode*)malloc(sizeof(BTNode));//为了代码好看,根节点我们提出来创建
root->data=Data[0];
root->right=root->left=NULL;
for(int i=1;i<n;i++){
p=(BTNode*)malloc(sizeof(BTNode));//创建新的节点,并给该节点赋值
p->data=Data[i];
p->left=p->right=NULL;
tail=root;//tail尾指针用来寻找当前节点应当插入的那个节点
while(tail){
pa=tail;//此时指针pa用来记录tail的位置,当tail跑到空时,pa在tail的最后一个不为空的节点上指着,即为待插入节点
if(p->data<tail->data) tail=tail->left;//判断向左还是向右跑
else tail=tail->right;
}
//从white循环出来后,pa指向了待插入的节点,此时再判断新节点应当往左还是右插
if(p->data<pa->data) pa->left=p;
else pa->right=p;
}
//直到for循环出来后,该二叉搜索树创建完成,返回root根节点即可
return root;
}
利用递归遍历输出该二叉树
void print(BTNode* root){ //中序遍历
if(root){
print(root->left);
cout<<root->data<<"\t";
print(root->right);
}
}
主函数如下:
int main(void){
int Data[8]={3,2,5,8,4,7,6,9};
BTNode *root=CreateTree(Data,8);
print(root);
}
4.效果图