7610人阅读 评论(0)

# 1、二叉查找树

## 1.1  二叉查找树的定义

• 若根节点的左子树非空，则左子树所有节点数值小于根节点；
• 若根节点的右子树非空，则右子树所有节点数值大于根节点；
• 左右子树分别为一颗二叉查找树.
// define data type for the key
typedef int keyType;

// define binary search tree data structure
struct BinaryTreeNode {
keyType key;
BinaryTreeNode* left; // left child
BinaryTreeNode* right; // right child
};

// alias for the tree
typedef BinaryTreeNode bstree;

// alias for the tree node
typedef BinaryTreeNode bstnode;

## 1.2 基本操作（查找、插入和删除节点）

(1) 查找key ：从定义一颗查找二叉树来看，可以利用其特性根据关键字进行快速查找，这和顺序表的二分查找一样。

// search BST by the given key
bstnode* search_by_key(bstree* tree, keyType key) {
bstnode* node = tree;
int found = 0;
while (NULL != node) {
if (key == node->key) {
found = 1;
break;
}
node = (key > node->key) ? node->right : node->left;
}
return found ? node : NULL;
}

(2) 插入key ：向BST中插入一个key，不能破坏BST的规则

// insert a key to BST
int insert_key(bstree* &tree, keyType key) {
if (NULL == tree) {
tree = (bstnode*) malloc(sizeof(bstnode));
tree->key = key;
return 1;
}

int found = 0;
bstnode* curr = tree;
bstnode* prev = NULL;
while (NULL != curr) {
if (key == curr->key) {
found = 1;
break;
}
prev = curr;
curr = (key > curr->key) ? curr->right : curr->left;
}
if (!found && NULL == curr) {
curr = (bstnode*) malloc(sizeof(bstnode));
curr->key = key;
((key > prev->key) ? prev->right : prev->left) = curr;
return 1;
}
return 0;
}


(3) 删除key ：在BST中删除一个key，不能破坏BST的规则

// delete a key from the BST
int delete_key(bstree* &tree, keyType key) {
// 设定临时树根，其key假设为无穷大，防止出现删除root的情况
// 主要作用是让原来树的root可以像其他节点一样参与运算

bstnode *curr = tree, *prev = head;
bstnode *t1 = NULL, *t2 = NULL;
int found = 0;
while (NULL != curr) {
if (key == curr->key) {
found = 1;
break;
}
prev = curr;
curr = ((key > curr->key) ? curr->right : curr->left);
}

if (found) {
// delete the node with the given key
if (NULL == curr->left) {     // when the left child of the node is NULL
((curr == prev->left) ? prev->left : prev->right) = curr->right;
free(curr);
} else if (NULL == curr->right) { // when the right child of the node is NULL
((curr == prev->left) ? prev->left : prev->right) = curr->left;
free(curr);
} else {     // when the node has two children
// 按照二叉查找树的特性，保持中序遍历顺序即可
// 即用该节点的中序前序后者后继替代该节点即可
t1 = curr->left;
while (NULL != t1->right) {
t2 = t1;
t1 = t1->right;
}
curr->key = t1->key;
((NULL == t2) ? curr->left : t2->right) = t1->left;
free(t1);
}
}

// 还原树根

return found;
}



int main() {

cout << "插入构建二叉查找树：4 2 5 3 1 6" << endl;
bstree * bst = NULL;
insert_key(bst, 4);
insert_key(bst, 2);
insert_key(bst, 5);
insert_key(bst, 3);
insert_key(bst, 1);
insert_key(bst, 6);
cout << endl;
cout << "遍历二叉查找树 ：" << endl << "前序\t : ";
rpre_order(bst);
cout << endl << "中序\t : ";
rin_order(bst);
cout << endl;
cout << endl;

cout << "删除元素 4 ： ";
int r = delete_key(bst, 4);
if (r) {
cout << "Success";
} else {
cout << "Failed";
}
cout << endl;
cout << "删除元素 32 ： ";
r = delete_key(bst, 32);
if (r) {
cout << "Success";
} else {
cout << "Failed";
}
cout << endl;

cout << endl;
cout << "刪除之后 ：" << endl << "前序\t : ";
rpre_order(bst);
cout << endl << "中序\t : ";
rin_order(bst);
cout << endl;

//
destory_btree(bst);

return 0;
}


插入构建二叉查找树：4 2 5 3 1 6



# 2、平衡二叉树

## 2.1 定义

《数据结构与算法》（高教社，2011）给出平衡树的定义是： 对于一颗含有 n 个节点的二叉树，其高度 h 控制在 节点数的对数范围内的都属于平衡     树, 即 h <= O ( log2(n) ) .

# 3、总结

3
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：320207次
• 积分：3357
• 等级：
• 排名：第10092名
• 原创：56篇
• 转载：2篇
• 译文：1篇
• 评论：80条
文章分类
评论排行
最新评论