3.1 二叉排序树
3.1.1 定义
-
二叉排序树的定义
又称二叉查找树(BST,Binary Search Tree)
二叉排序树是具有以下性质的二叉树:
左子树结点值<根结点值<右子树结点值
- 进行中序遍历,可以得到一个递增的有序序列。
3.1.2 查找操作
-
步骤
1.若树非空,目标值与根结点的值比较;
2.若相等,则查找成功;
若小于根结点,则在左子树上查找;
否则在右子树上查找;
3.查找成功返回结点指针;查找失败返回NULL。
-
代码
//二叉排序树结点 typedef struct BSTree{ int key; struct BSTNode *lchild,*rchild; }BSTNode,*BSTree; //在二叉排序树中查找值为key的结点 BSTNode *BST_search(BSTree T,int key){ //若树为空或等于根结点值,则结束循环 while(T!=NULL&&key!=T->key){ if(key<T->key) T=T->lchild; //key小,则在左子树上找 else T=T->rchild; //key大,则在右子树上找 } return T; }
-
用递归方式实现
BSTNode *BSTSearch(BSTree T,int key){ if(T==NULL) return NULL; if(key==T->key) return T; else if(key<T->key) return BSTSearch(T->lchild,key); //递归在左树中找 else return BSTSearch(T->rchild,key); //递归在右子树中找 }
- 递归的最坏空间复杂度 O ( h ) O(h) O(h),非递归是 O ( 1 ) O(1) O(1),所以非递归效率更加好。
3.1.3 插入操作
-
思路
若原二叉树为空,则直接插入结点;
否则,若关键字k小于根结点值,则插入到左子树;
若关键字k大于根结点值,则插入到右子树。
-
代码
//在二叉排序树插入