描述
二叉排序树,也称为二叉查找树。
可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
- 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
- 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
- 左、右子树本身也是一颗二叉排序树。
现在给你 N 个关键字值各不相同的节点。
要求你将这些节点按顺序插入一个初始为空树的二叉排序树中。
每次成功插入一个节点后,求其相应的父亲节点的关键字值,如果没有父亲节点,则输出 −1。
输入描述:
第一行包含整数 N,表示待插入的节点数。
第二行包含 N 个互不相同的正整数,表示要顺序插入节点的关键字值。
输入
5
2 5 1 3 4
输出
-1
2
2
5
3
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string>
using namespace std;
struct TreeNode {
char data;
TreeNode* left;
TreeNode* right;
};
void InsertBST(TreeNode*& proot, int data) {
TreeNode* pNew = new TreeNode;
pNew->data = data;
pNew->left = NULL;
pNew->right = NULL;
if (proot == NULL) {
proot = pNew;
//printf("-1\n");
}
else {
TreeNode* pCur = proot; // pCur 向下探索
TreeNode* pPre; // pPre指向pCur的父亲
while (1) {
if (pCur->data > data) {
pPre = pCur;
pCur = pCur->left;
if (pCur == NULL) {
pPre->left = pNew;
//printf("%d\n", pPre->data);
break;
}
}
else {
pPre = pCur;
pCur = pCur->right;
if (pCur == NULL) {
pPre->right = pNew;
//printf("%d\n", pPre->data);
break;
}
}
}
}
}
int main() {
int n;
scanf("%d", &n);
TreeNode* proot = NULL;
for (int i = 0; i < n; ++i) {
int data;
scanf("%d", &data);
InsertBST(proot, data);
}
return 0;
}