二叉树——应用
二叉树——应用
二叉排序树(BST)
-
二叉排序树的定义
或者是一棵空树,或者有如下性质的树:
(1)若左子树非空,则左子树上所有节点关键字值均小于根节点的关键字值;
(2)若右子树非空,则右子树上所有节点关键字值均大于根节点的关键字值;
(3)左右子树也分别是一颗二叉排序树。
因此,对二叉排序树的中序遍历得到的就是一个递增的序列。 -
二叉排序树的查找
从根节点开始,沿一个分支逐层向下进行比较的过程。若二叉树非空,将给定的关键字与根节点的值比较,如果相同则查找成功,如果不相同,如果给定的关键字的值大于根节点的值那么转向右子树寻找,如果小于则向左子树寻找。
算法表示如下所示:
BSTNode* BST_Search(BiTree T, ElemType key, BSTNode *p) { // 查找函数返回指向关键字值为key的节点指针,如果不存在, // 返回NULL // p指向被查找节点的双亲节点 p = NULL; while(T && key != T->data) { p = T; if (key < T -> data) T = T -> lchild; else T = T -> rchild; } return T; } BSTNode* BST_RecurSearch(BiTree T, ElemType key, BSTNode *p) { // 算法的递归实现形式 if (T) { if (key == T -> data) return T; else if (key < T -> data) BST_RecurSearch(T -> lchild, key, T) else BST_RecurSearch(T -> rchild, key, T) } }
-
二叉排序树的插入
在查找的过程中,如果没有查找到关键字值的二叉树时,将节点插入到二叉树中,如果二叉树原本为空则要插入的节点为根节点,如果要插入的值比根节点的值大则插入到右子树中,如果比根节点的值小,则插入到左子树中。算法如下所示:
int BST_Insert(BiTree &T, ElemType key) { // 如果二叉树中存在值为key的节点,那么返回0; // 如果二叉树中不存在值为key的节点,那么插入节点并返回1; if (T == NULL) { T = (BSTNode*)malloc(sizeof(BSTNode)); T -> data = key; T -> lchild = T -> rchild = NULL; return 1; } else if (T -> data == key) { retur