二叉搜索树

来源:互联网 发布:Date java 编辑:程序博客网 时间:2024/06/05 23:44

1.什么是二叉搜索树

顾名思义,一颗二叉搜索树是以一颗二叉树来组织的,如图(a)所示。这样一棵树可以使用一个链表数据结构来表示,其中么一个节点就是一个对象。除了key和卫星数据以外,每个结点还包含属性left、right和p,他们分别指向节点的左孩子、右孩子和双亲。如果某个孩子节点和父节点不存在,则相应的属性的值为NIL。根节点是树中唯一父指针为NIL的结点。



二叉搜索树中的关键字总是以满足二叉搜索树性质的方式来存储:

设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么y.key ≤ x.key。 如果y是x右子树中的一个结点,那么y.key ≥ x.key。

因此,在图(a)中,树根的关键字为6,在其左子树中有关键字2、5和5,它们均不大于6;而在其右子树中有关键字7和8,它们均不小于6.这个性质对树中的每个结点都成立。例如,树根的左孩子为关键字5,不小于其左子树中的关键字2并且不大于其右子树中的关键字5.

二叉搜索树性质允许我们通过一个简单的递归算法来按序输出二叉搜索树中的关键字,下面用,先生称一颗二叉搜索树,然后用中序遍历(inorder tree walk)算法输出图(a)的二叉搜索树。

#include <iostream>using namespace std;typedef struct BSTree{char node_value;struct BSTree *left;struct BSTree *right;} Tree;/*****构造二叉查找树**********************************************/void  CreateBSTree(Tree *root, char node_value);Tree *CreateBSTree(char *array_list, int array_length);void Print(Tree *root);int main(){Tree *root = NULL;char list[] = {'6', '5', '7', '2', '5', ' ', '8'};root = CreateBSTree(list, 7);cout << "Cearte BSTree." << endl;Print(root);return 0;}Tree *CreateBSTree(char *array_list, int array_length){if(array_length <= 0){return false;}Tree *root = NULL;root = new BSTree();root->left = NULL;root->right = NULL;root->node_value = array_list[0];for(int i = 1; i < array_length; i++){CreateBSTree(root, array_list[i]);}return root;}void  CreateBSTree(Tree *root, char node_value){if (node_value !=' '){if(root == NULL){return ;}if(root->node_value > node_value){if(root->left == NULL){Tree *node = new Tree();node->left = NULL;node->right = NULL;node->node_value = node_value;root->left = node;}else{CreateBSTree(root->left, node_value);}}else{if(root->right == NULL){Tree *node = new Tree();node->left = NULL;node->right = NULL;node->node_value = node_value;root->right = node;}else{CreateBSTree(root->right, node_value);}}}else{Tree *node =NULL;}}void Print(Tree *root){if(root == NULL){return ;}Print(root->left);cout << char(root->node_value) <<endl;Print(root->right);}
结果见下图:








0 0
原创粉丝点击