二叉查找树 数据结构 1

二叉查找树又名二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:

(1)若它的左子树不空,则左子树上所有节点的值均小于他的根节点的值;

(2)若它的右子树不空,则右子树上所有节点的值均大于他的根节点的值;

(3)他的左右子树也分别为二叉排序树(二叉查找树)

1、查找 

   若二叉查找树非空,则将待查关键字值与根结点的关键 字值进行比较:

(1)若两者相等,则查找成功;

(2)若待查关键字值较小,则在左子树上继续查找;

(3)若待查关键字值较大,则在右子树上继续查找;

思路:

设二叉查找树T,待查关键字skey。

(1)若T为空,则返回NULL;

(2)若T->data.key==skey,则返回T;

(3)若T->data.key>skey,则在T->lchild所指左子树上递归查找;

(4)若T->data.key<skey,则在T->rchild所指右子树上递归查找;

2、插入

    设已有二叉查找树T,若要在其中插入元素e,则应先在T中查找e,若找到,则不必插入,若找不到,则插入位置为查找路径上访问的最后一个结点的左/右孩子位置。

思路:

(1)若二叉查找树T为空树,则新元素e插入为根结点;

(2)若二叉查找树T非空,则应在T中查找e:

       ①若找不到,则令p指向查找路径上访问的最后一个结点;

       ②若找到,则令p指向该结点;

(3)若未在T中找到e,则:

       ①若e.key<p->data.key,则e插入为p的左孩子;

       ②若e.key>p->data.key,则e插入为p的右孩子;

 思路细化:

     在T中查找e的过程:

(1)仅当T非空时需进行查找;

(2)若T->data.key==e.key,则令p=T,返回TRUE;

(3)若T->data.key>e.key,

       ①若T->lchild为空,则令p=T,返回FALSE;

       ②若T->lchild非空,则在左子树上递归查找;

(4)若T->data.key<e.key,

      ①若T->rchild为空,则令p=T,返回FALSE;

      ②若T->rchild非空,则在右子树上递归查找。

 

3、删除

     设已有二叉查找树T,待删结点为e,则应先在T中查找e,若找到,则删除结点e,并对T进行调整,使其仍为一棵二叉查找树。

(1)待删节点为叶子节点:    直接删掉节点

(2)待删节点无左子树:   (删除节点)让右子树的根节点占据其位置;

(3)待删节点无右子树:   (删除节点)让左子树的根节点占据其位置;

(4)待删节点既有右子树又有左子树: 删除节点后,   方法一: 让左子树的根占据其位置,并让右子树的根成为左子树最右节点的右子树;

                                                                                   让右子树的根占据其位置,并让左子树的根成为右子树最左节点的左子树;

                                                                      方法二: 让待删节点的左子树上的最右叶子节点替换待删节点;

                                                                                   让待删节点的右子树上的最左叶子节点替换待删节点;

 

4、构造

       二叉查找树的构造过程是从空树开始,不断向其中插入结点的过程。

posted @ 2014-04-16 11:31  zhoudan  阅读(151)  评论(0编辑  收藏  举报