题目描述:
二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
3. 左、右子树本身也是一颗二叉排序树。 现在给你N个关键字值各不相同的节点,要求
你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点
的关键字值,如果没有父亲节点,则输出-1。
输入:
输入包含多组测试数据,每组测试数据两行。 第一行,一个数字N(N<=100),
表示待插入的节点数。 第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,这些值不超过10^8。
输出:
输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。
代码实现:
#include <cstdio>
#include <string>
using namespace std;
struct TreeNode{
int data;
TreeNode * leftChild;
TreeNode * rightChild;
};
void insertBST(TreeNode * &root, int data){
TreeNode *pNewNode = new TreeNode;
pNewNode->data = data;
pNewNode->leftChild = NULL;
pNewNode ->rightChild = NULL;
if(root == NULL){
root = pNewNode;
printf("-1\n");
}
else{
TreeNode *pPre = root;
TreeNode *pCur;
while(true){
if(data < pPre->data){
pCur = pPre->leftChild;
if (pCur == NULL){
pPre->leftChild = pNewNode;
printf("%d\n",pPre->data);
break;
}
else{
pPre = pCur;
}
}
else{
pCur = pPre->rightChild;
if (pCur == NULL){
pPre ->rightChild = pNewNode;
printf("%d\n",pPre->data);
break;
}
else{
pPre= pCur;
}
}
}
}
}
int main(){
int n;
scanf("%d",&n);
TreeNode * root = NULL;
for (int i = 0; i < n; ++i) {
int num;
scanf("%d",&num);
insertBST(root,num);
}
}
输入
5
2 5 1 3 4
输出
-1
2
2
5
3