二叉排序平衡树查找-动态查找
更新:2013-12-02
//
需要掌握的前提知识是二叉排序树查找
名称:二叉排序平衡树查找
关键字:二叉平衡树,二叉排序树
在二叉排序树的不断插入查找中,有可能出现极端情况,最坏情况例如:
每棵树都只有右孩子。那样查找变成了顺序查找了。
为了使排序树的深度最小,需要对每棵树的左右孩子进行平衡处理,成为
二叉平衡树。
二叉平衡树:它是一棵空树,或者,它的左孩子或右孩子不为空的话也为
平衡二叉树。二叉平衡树的左孩子和右孩子的深度差绝对值不能超过1。
如果将平衡因子设为左子树的深度减去右子树的深度,那么值有-1,0,1。
一插入根结点,二插入叶子结点。
插入根结点较为简单,着重看插入叶子结点的情况。
(1)设有树tree1:
a(2) b(0)
/ \ / \
b(1) ar => bl a(0)
/ \ ^ / \
bl br c br ar
^
c
或树tree1':
a(2) b(0)
/ / \
b(1) => bl a(0)
/
^
bl
因为插入新结点而使树的平衡因子变为2,在这种情况下,需要作
单向右旋平衡处理:
b和a交换位置,a接管b的右孩子br,那样树就平衡了,并且树的结点被中
序遍历的顺序不变。
(2)设有树tree2:
a(-2) b(0)
/ \ / \
al b(-1) => a(0) br
/ \ / \ ^
bl br al bl c
^
c
或树tree2':
a(-2) b(0)
\ / \
b(-1) => a(0) br
\
^
br
因为插入新结点而使树的平衡因子变为-2,在这种情况下,需要作
单向左旋平衡处理:
b和a交换位置,a接管b的左孩子bl,那样树就平衡了,并且树的结点被中序
遍历的顺序不变。因为不确定bl是否为NULL,所以a的平衡因子不确定。
(3)设有树tree3:
a(2) a(2) ____br(0)____
/ \ / \ / \
b(-1) ar => br(?) ar => b(?) a(?)
/ \ / \ / \ / \
bl br(?) b(?) null\d bl c\null null\d ar
/ \ / \
c\null null\d bl c\null
或树tree3':
a(2) a(2) br(0)
/ / / \
b(-1) => br(1) => b(0) a(0)
\ /
^ b(0)
br
因为插入新结点或d结点而使树的平衡因子变为2,在这种情况下,需要作
双向旋转(先左后右)平衡处理:先b和br作单向左旋,然后br和a作单向
右旋,那样树就平衡了。并且树的结点被中序遍的顺序不变。
(4)设有树tree4:
a(-2) a(-2) ____bl(0)____
/ \ / \ / \
al b(1) => al bl(?) => a(?) b(?)
/ \ / \ / \ / \
bl(?) br c\null b(?) al c\null null\d br
/ \ / \
c\null null\d null\d br
或树tree4':
a(-2) a(-2) bl(0)
\ \ / \
b(1) => bl(-1) => a(0) b(0)
/ \
^ b(0)
bl
因为插入新结点或d结点而使树的平衡因子变为-2,在这种情况下,需要作
双向旋转(先右后左)平衡处理:先b和bl作单向右旋,然后br和a作单向
左旋,那样树就
更新:2013-12-02
//
需要掌握的前提知识是二叉排序树查找
名称:二叉排序平衡树查找
关键字:二叉平衡树,二叉排序树
在二叉排序树的不断插入查找中,有可能出现极端情况,最坏情况例如:
每棵树都只有右孩子。那样查找变成了顺序查找了。
为了使排序树的深度最小,需要对每棵树的左右孩子进行平衡处理,成为
二叉平衡树。
二叉平衡树:它是一棵空树,或者,它的左孩子或右孩子不为空的话也为
平衡二叉树。二叉平衡树的左孩子和右孩子的深度差绝对值不能超过1。
如果将平衡因子设为左子树的深度减去右子树的深度,那么值有-1,0,1。
讨论一下插入结点时的平衡操作。
插入结点可以分为两种:一插入根结点,二插入叶子结点。
插入根结点较为简单,着重看插入叶子结点的情况。
(1)设有树tree1:
a(2) b(0)
/ \ / \
b(1) ar => bl a(0)
/ \ ^ / \
bl br c br ar
^
c
或树tree1':
a(2) b(0)
/ / \
b(1) => bl a(0)
/
^
bl
因为插入新结点而使树的平衡因子变为2,在这种情况下,需要作
单向右旋平衡处理:
b和a交换位置,a接管b的右孩子br,那样树就平衡了,并且树的结点被中
序遍历的顺序不变。
(2)设有树tree2:
a(-2) b(0)
/ \ / \
al b(-1) => a(0) br
/ \ / \ ^
bl br al bl c
^
c
或树tree2':
a(-2) b(0)
\ / \
b(-1) => a(0) br
\
^
br
因为插入新结点而使树的平衡因子变为-2,在这种情况下,需要作
单向左旋平衡处理:
b和a交换位置,a接管b的左孩子bl,那样树就平衡了,并且树的结点被中序
遍历的顺序不变。因为不确定bl是否为NULL,所以a的平衡因子不确定。
(3)设有树tree3:
a(2) a(2) ____br(0)____
/ \ / \ / \
b(-1) ar => br(?) ar => b(?) a(?)
/ \ / \ / \ / \
bl br(?) b(?) null\d bl c\null null\d ar
/ \ / \
c\null null\d bl c\null
或树tree3':
a(2) a(2) br(0)
/ / / \
b(-1) => br(1) => b(0) a(0)
\ /
^ b(0)
br
因为插入新结点或d结点而使树的平衡因子变为2,在这种情况下,需要作
双向旋转(先左后右)平衡处理:先b和br作单向左旋,然后br和a作单向
右旋,那样树就平衡了。并且树的结点被中序遍的顺序不变。
(4)设有树tree4:
a(-2) a(-2) ____bl(0)____
/ \ / \ / \
al b(1) => al bl(?) => a(?) b(?)
/ \ / \ / \ / \
bl(?) br c\null b(?) al c\null null\d br
/ \ / \
c\null null\d null\d br
或树tree4':
a(-2) a(-2) bl(0)
\ \ / \
b(1) => bl(-1) => a(0) b(0)
/ \
^ b(0)
bl
因为插入新结点或d结点而使树的平衡因子变为-2,在这种情况下,需要作
双向旋转(先右后左)平衡处理:先b和bl作单向右旋,然后br和a作单向
左旋,那样树就