二叉查找树 数据结构 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、构造
二叉查找树的构造过程是从空树开始,不断向其中插入结点的过程。