原来平衡二叉树算法这样复杂,居然找不到一个满意的算法说明。大家帮帮忙,该如何解决
原来平衡二叉树算法这样复杂,居然找不到一个满意的算法说明。大家帮帮忙
很简单,实现平衡二叉树的删除插入功能。
这里只需要大家讨论一下
1.如何发现树的不平衡。
2.怎么样对不平衡的情况进行分类,并分别使其恢复平衡——这里最麻烦的是双旋转问题
给大家解释一下:
如果发现节点a是最底层的不平衡节点,而且a的新加入的节点在右子树中
(a的bf值为-2,即左子树高度减右子树高度)
这时要恢复平衡需要进行双旋转,
那么双旋转该怎么旋呢? 旋转后的节点分布如何?
节点g
节点p 节点d
节点a 节点c
a1 a2
------解决方案--------------------
很复杂吗?
理论不复杂,但写代码 有点复杂
------解决方案--------------------
stl源码剖析
中讲的很细致,而且还有图
------解决方案--------------------
是的,看《STL源码剖析》
------解决方案--------------------
搜索“红黑树”,STL的map,set等底层都是用它实现的
------解决方案--------------------
去看严蔚敏的《数据结构》 会有你的答案。
------解决方案--------------------
很多DS上都讲得很清楚吧
------解决方案--------------------
我刚实现了这个功能.....
树的不平衡 可以由左右子树的高度差判断.
另外:
void fixAfterinsertion(Link ancestor,Link inserted)
{
Link root = header-> parent;
T item =inserted-> item;
if(ancestor == NULL)
{
if(compare(item,root-> item))
root -> balanceFactor = 'L ';
else
root -> balanceFactor = 'R ';
adjustPath(root,inserted);
}//case 1;
else if((ancestor-> balanceFactor == 'L ' && !compare(item,ancestor-> item)) ||
(ancestor-> balanceFactor == 'R ' && compare(item,ancestor-> item)))
{
ancestor-> balanceFactor = '= ';
adjustPath(ancestor,inserted);
}//case 2;
else if(ancestor-> balanceFactor == 'R ' && !compare(item,ancestor-> right-> item))
{
ancestor-> balanceFactor = '= ';
rotate_left(ancestor);
adjustPath(ancestor-> parent,inserted);
}//case 3;
else if(ancestor-> balanceFactor == 'L ' && compare(item,ancestor-> left-> item))
{
ancestor-> balanceFactor = '= ';
rotate_right(ancestor);
adjustPath(ancestor-> parent,inserted);
}//case 4;
else if(ancestor-> balanceFactor == 'L ' && !compare(item,ancestor-> left-> item))
{
rotate_left(ancestor-> left);
rotate_right(ancestor);
adjustLeftRight(ancestor,inserted);
}//case 5;
else
{
rotate_right(ancestor-> right);
rotate_left(ancestor);
adjustRightLeft(ancestor,inserted);
}//case 6;
}//fixAfterinsertion
很简单,实现平衡二叉树的删除插入功能。
这里只需要大家讨论一下
1.如何发现树的不平衡。
2.怎么样对不平衡的情况进行分类,并分别使其恢复平衡——这里最麻烦的是双旋转问题
给大家解释一下:
如果发现节点a是最底层的不平衡节点,而且a的新加入的节点在右子树中
(a的bf值为-2,即左子树高度减右子树高度)
这时要恢复平衡需要进行双旋转,
那么双旋转该怎么旋呢? 旋转后的节点分布如何?
节点g
节点p 节点d
节点a 节点c
a1 a2
------解决方案--------------------
很复杂吗?
理论不复杂,但写代码 有点复杂
------解决方案--------------------
stl源码剖析
中讲的很细致,而且还有图
------解决方案--------------------
是的,看《STL源码剖析》
------解决方案--------------------
搜索“红黑树”,STL的map,set等底层都是用它实现的
------解决方案--------------------
去看严蔚敏的《数据结构》 会有你的答案。
------解决方案--------------------
很多DS上都讲得很清楚吧
------解决方案--------------------
我刚实现了这个功能.....
树的不平衡 可以由左右子树的高度差判断.
另外:
void fixAfterinsertion(Link ancestor,Link inserted)
{
Link root = header-> parent;
T item =inserted-> item;
if(ancestor == NULL)
{
if(compare(item,root-> item))
root -> balanceFactor = 'L ';
else
root -> balanceFactor = 'R ';
adjustPath(root,inserted);
}//case 1;
else if((ancestor-> balanceFactor == 'L ' && !compare(item,ancestor-> item)) ||
(ancestor-> balanceFactor == 'R ' && compare(item,ancestor-> item)))
{
ancestor-> balanceFactor = '= ';
adjustPath(ancestor,inserted);
}//case 2;
else if(ancestor-> balanceFactor == 'R ' && !compare(item,ancestor-> right-> item))
{
ancestor-> balanceFactor = '= ';
rotate_left(ancestor);
adjustPath(ancestor-> parent,inserted);
}//case 3;
else if(ancestor-> balanceFactor == 'L ' && compare(item,ancestor-> left-> item))
{
ancestor-> balanceFactor = '= ';
rotate_right(ancestor);
adjustPath(ancestor-> parent,inserted);
}//case 4;
else if(ancestor-> balanceFactor == 'L ' && !compare(item,ancestor-> left-> item))
{
rotate_left(ancestor-> left);
rotate_right(ancestor);
adjustLeftRight(ancestor,inserted);
}//case 5;
else
{
rotate_right(ancestor-> right);
rotate_left(ancestor);
adjustRightLeft(ancestor,inserted);
}//case 6;
}//fixAfterinsertion