【问题描述】
二叉排序树,也称为二叉查找树。可以是一颗空树,也可以是一颗具有如下特性的非空二叉树:
若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值;
若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值;
左、右子树本身也是一颗二叉排序树。
现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉排序树中,每次插入后成功后,求相应的父亲节点的关键字值,如果没有父亲节点,则输出-1。
【输入形式】
输入一共两行。
第一行,一个数字N(N<=100),表示待插入的节点数。
第二行,N个互不相同的正整数,表示要顺序插入节点的关键字值,用空格分隔。
【输出形式】
输出共N行,每次插入节点后,该节点对应的父亲节点的关键字值。
【样例输入】
5
2 5 1 3 4
【样例输出】
-1
2
2
5
3
#include <iostream>
using namespace std;
template <class KEY>
class BinarySearchTree
{
private:
struct BinaryNode
{
KEY data;
BinaryNode* left;
BinaryNode* right;
BinaryNode(const KEY& thedata, BinaryNode* lt = NULL, BinaryNode* rt = NULL) :data(thedata), left(lt), right(rt) {}
};
BinaryNode* root;
public:
BinarySearchTree();
~BinarySearchTree();
void insert(const KEY& x);
private:
void makeEmpty(BinaryNode* t);
};
template <class KEY>
void BinarySearchTree<KEY>::insert(const KEY& x)
{
BinaryNode* nd = new BinaryNode(x, NULL, NULL); // 为插入元素申请结点
if (root==NULL) {
root = nd;
cout << -1 << endl;
return;
} // 在空树上插入
BinaryNode* now = root;
while (true) { // 寻找插入位置并插入
if (x > now->data){
if(now->right == NULL){
now->right = nd;
cout << now->data << endl;
break;
}
now = now->right;
}
else if (now->left == NULL) {
now->left = nd;
cout << now->data << endl;
break;
}
else now = now->left;
}
}
template <class KEY>
BinarySearchTree<KEY>::BinarySearchTree()
{
root = NULL;
}
template <class KEY>
BinarySearchTree<KEY>::~BinarySearchTree()
{
makeEmpty(root);
}
template <class KEY>
void BinarySearchTree<KEY>::makeEmpty(BinaryNode* t)
{
if (t == NULL) return;
makeEmpty(t->left);
makeEmpty(t->right);
delete t;
}
int main()
{
int N;
cin >> N;
int* a = new int[N];
for (int i = 0; i < N; ++i) {
cin >> a[i];
}
BinarySearchTree<int> tree;
for (int i = 0; i < N; ++i) {
tree.insert(a[i]);
}
return 0;
}
网络上有更简便的方法,但这题按教学要求大概就是要用类来做。其中,insert函数不能用递归实现,而是要用非递归实现。