题目
description:
假设二叉排序树以后继线索链表作存储结构,编写程序,满足以下要求:
1. 输出该二叉排序树中所有大于 a 小于 b 的关键字;
2. 在二叉排序树中插入一个关键字;
3. 在二叉排序树中删除一个关键字。
input:
第一行按先序输入二叉排序树各结点(结点值大于 0),其中-1 表示取消建立子树结点;
第二行输入要求 1 中 a、b,用空格隔开;
第三行输入要求 2 中要插入的关键字;
第四行输入要求 3 中要删除的关键字。
output:
按照中序序列,分三行输出要求 1、要求 2 和要求 3 的结果。
sample_input:
12 8 4 -1 -1 10 -1 -1 16 13 -1 -1 18 -1 -1
10 17
6
12
sample_output:
12 13 16
4 6 8 10 12 13 16 18
4 8 10 13 16 18
思路
- 输入创建二叉排序树
见上一篇文章《24 二叉排序树的判别(耿 8.6)》 - 查找
依然是递归
void search(BTNode *T, int a, int b) {
if (T) {
search(T->lc, a, b);
if (a < T->key && T->key < b)
cout << T->key << " ";
search(T->rc, a, b);
}
}
- 插入
和查找类似,如果要插入的关键字存在,则直接返回,否则递归查找要插入的位置,直到找到合适的空指针,找到空指针的时候创建新结点,然后将关键字插入。
void insert(BTNode *&T, int p) {
if (!T) {
T = (BTNode *)malloc(sizeof(BTNode));
T->key = p;
T->lc = T->rc = NULL;
return;
} else {
if (T->key == p) {
return;
} else if (T->key > p) {
insert(T->lc, p);
} else {
insert(T->rc, p);
}
}
}
-
删除
deleteT()与查找思想类似。
若直接删除二叉排序树中的某个结点,则会剩下两个二叉排序树。故编写RemoveBTNode()。
以下内容转载于文章: 二叉排序树(查询、插入、删除).
删除节点有三种情况分析:a. 叶子节点;(直接删除即可)