二叉查找树
定义:
二叉查找树(二叉排序树)或者是一棵空树,或者是具有下列性质的二叉树:
- 每个结点都有一个作为查找依据的关键字(key),所有结点的关键字互不相同。
- 左子树(若非空)上所有结点的关键字都小于根结点的关键字。
- 右子树(若非空)上所有结点的关键字都大于根结点的关键字。
- 左子树和右子树也是二叉查找树
如果对一棵二叉查找树进行中序遍历,可以按从小到大的顺序,将各结点关键字排列起来
AVL树 高度平衡的二叉查找树
定义:
一棵AVL树或者是空树,或者是具有下列性质的二叉查找树:它的左子树和右子树都是AVL树,且左子树和右子树的高度之差的绝对值不超过1。
二
叉查找树上的构建
二叉查找树上的构建:
1.构造过程: 从空树出发,依次插入R1~ Rn各数据值: (1)如果二叉查找树是空树,则插入结点就 是二叉查找树的根结点; (2)如果二叉查找树是非空的,则插入值与 根结点比较,若小于根结点的值,就插 入到左子树中去;否则插入到右子树 中。
查找树代码(函数实现形式):
#include <iostream>
using namespace std;
//定义元素
typedef struct{
int key;
}ElemType;
//定义节点
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild, *rchild;
// BiTNode(int d = 0, struct BiTNode* l = NULL, struct BiTNode* r = NULL) : data(d), lchild(l), rchild(r) {}
}BiTNode, *BiTree;
//插入查找树
void insert_BST(BiTree& T, BiTree S){
BiTree p, q;
if(!T) T = S;
else {
p = T;
while(p) {
q = p;
if(S->data.key < p->data.key) p = p->lchild;
else p = p->rchild;
}
if(S->data.key < q->data.key) q->lchild = S;
else q->rchild = S;
}
}
//查找节点,插入节点
int search_BST(BiTree& T, int key){
BiTree p = T, q, S;
while(p){
if(p->data.key == key) return 1;
else if(p->data.key > key){ q = p; p = p->lchild; }
else { q = p; p = p->rchild; }
}
S = new BiTNode;
S->data.key = key;
S->lchild = S->rchild = NULL;
if(!T) T = S;
else if(key < q->data.key) q->lchild = S;
else q->rchild = S;
return 0;
}
//删除节点
void delNode(BiTree &T, BiTree p, BiTree f){
BiTree s, q;
int tag = 0;
if(!p->lchild) s = p->rchild;
else if(!p->rchild) s = p->lchild;
else{
q = p; s = p->rchild;
while(s->rchild) {q = s; s = s->rchild; }
p -> data = s->data;
if(p == q) q->lchild = s->lchild;
else q->rchild =s->lchild;
}
if(!tag){
if(!f) T = s;
else if(f->lchild == p) f->lchild = s;
else f->rchild = s;
delete p;
}
}
//从二叉查找树上删除节点
int delete_BST(BiTree &T, int key){
BiTree p, f;
p = T; p = NULL;
while(p){
if(p->data.key == key) { delNode(T, p, f); return 1; }
else if(p->data.key > key) { f = p; p = p->lchild; }
else { f = p; p = p->rchild; }
}
return 0;
}
//中序遍历
void travel_BST(const BiTree& T){
if(!T) return;
travel_BST(T->lchild);
cout << T->data.key << " ";
travel_BST(T->rchild);
}
int main(){
int key[10] = {11, 2, 3, 54, 66, 123, 5, 9, 18, 83};
BiTree T = NULL;
cin >> key[0];
for(int i = 0; i < 10; i++) search_BST(T, key[i]);
travel_BST(T);
//for(int i = 0; i < 10; i++) delete_BST(T, key[i]);
}