图解数据结构7二叉查找树及平衡二叉查找树Word文件下载.docx
- 文档编号:16306593
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:23
- 大小:193.33KB
图解数据结构7二叉查找树及平衡二叉查找树Word文件下载.docx
《图解数据结构7二叉查找树及平衡二叉查找树Word文件下载.docx》由会员分享,可在线阅读,更多相关《图解数据结构7二叉查找树及平衡二叉查找树Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
我们先要分析,为什么树会失衡?
是由于插入了一个元素,对吧,那我们能不能把不同的插入情况全部概括起来并作出统一的调整来使得树重新平衡?
答案是肯定的,也有人帮我们研究好了,只是证明这个过程需要一些数学功底,我是不行的了,所以直接给出算法示意图和范例。
LL型调整:
再给一个LL型调整的实例:
RR型调整,其实就是LL型调整的镜像而已:
这是一个RR型调整的实例:
接下去就是LR型调整:
这是一个LR型调整的实例:
RL型调整是LR型调整的镜像,所以不再画图了。
至于如何选择不同的调整类型,我后面将给出代码,看“DoBalance”这个函数的实现,很清晰的。
那接下去我们还要面临一个比较困难的问题,就是删除及删除平衡,因为不光是插入元素可能导致不平衡,删除也会。
不过我们都有个同样的前提,就是无论是插入前还是删除前的二叉树,都是平衡的。
我参考的书上说删除和插入其实是很类似的,具体实现却没说,我后来写代码蛮辛苦的,最后发现确实差别不大,但在调整相关节点高度的时候确实有点细微上的差别,这个在我的代码里也能看得出来。
下面我就给出我的代码,我已经通过了初步的测试,不过也许代码还有bug,如果发现了,请留言。
代码比较长,其中还利用了之前的堆栈和队列结构,可以算是复习,如果觉得代码晦涩难懂,也可以跳过,有些怕自己的代码写得不够好……
另附带一些代码说明:
1,TreeNode目前只带一个“数据”,就是iData,所以交换节点位置时候,为了方便,只需要交换这个数据;
2,代码中的pMinBST指向的是“最小不平衡树”,即:
从插入或删除的位置开始往上查找出现的第一个不平衡的节点;
3,“往上查找”就需要借助一个Stack结构;
4,AVL树的析构采用了后序遍历,由于是析构,之后不再用到,所以后序遍历时候改变了节点指针的值,后续遍历使用了Queue结构;
5,删除节点时候,寻找并交换叶子节点的操作有些晦涩,往左寻找最大节点,为什么找到了最大并交换,而它还不是叶子的时候,我只需要再往左找并交换一次就可以了呢?
因为我删除到时候有个前提:
这棵树是平衡的,往右寻找最小节点的道理跟这个一样的;
6,有什么问题请留言。
#include
"
stdio.h"
//
TreeNode
//////////////////////////////////////////////////////////////////////////
struct
{
TreeNode(int
iVal);
int
UpdateHeight();
GetLeftHeight();
GetRightHeight();
GetDiff();
//Left
Height
-
Right
height
iData;
iHeight;
TreeNode*
pLeft;
pRight;
};
TreeNode:
:
iVal)
iData
=
iVal;
iHeight
0;
pLeft
pRight
}
UpdateHeight()
iHeightLeft
iHeightRight
if(iHeightLeft==0
&
iHeightRight==0)
else
(iHeightLeft>
iHeightRight)?
(iHeightLeft):
(iHeightRight);
return
GetLeftHeight()
if(pLeft!
=0)
pLeft->
+
1;
GetRightHeight()
if(pRight!
pRight->
GetDiff()
iHeightRight;
Stack
class
public:
Stack(int
iAmount
10);
~Stack();
//return
1
means
succeeded,
0
failed.
Pop(TreeNode*
val);
Push(TreeNode*
Top(TreeNode*
//iterator
GetTop(TreeNode*
GetNext(TreeNode*
private:
TreeNode**
m_pData;
m_iCount;
m_iAmount;
m_iCurr;
Stack:
iAmount)
m_pData
new
TreeNode*[iAmount];
m_iCount
m_iAmount
iAmount;
m_iCurr
~Stack()
delete
val)
if(m_iCount>
0)
--m_iCount;
val
m_pData[m_iCount];
if(m_iCount<
m_iAmount)
m_pData[m_iCount]
val;
++m_iCount;
m_iCount<
=m_iAmount)
m_pData[m_iCount-1];
if((m_iCurr-1)<
(m_iCount-1)
(m_iCurr-1)>
--m_iCurr;
m_pData[m_iCurr];
The
Queue
Queue(int
iAmount=10);
~Queue();
failed,
succeeded.
Enqueue(TreeNode*
node);
Dequeue(TreeNode*
m_ppFixed;
//The
pointer
array
to
implement
the
queue.
m_iHead;
m_iTail;
Queue:
m_ppFixed
m_iHead
m_iTail
iAmount-1;
~Queue()
delete[]
node)
++m_iTail;
if(m_iTail
>
m_iAmount-1)
m_ppFixed[m_iTail]
node;
node
m_ppFixed[m_iHead];
++m_iHead;
if(m_iHead
AVLTree
CAVLTree
CAVLTree();
~CAVLTree();
Insert(int
Delete(int
FindNode(int
//the
find
function,
returns
not
found.
#ifdef
_DEBUG
void
PrintTree();
#endif
protected:
//Update
height
after
insert
or
delete.
//And
minimum
unbalance
BST.
UpdateHeight(Stack
st,
pMinBST,
pMinBSTParent,
int&
iLeftRight);
//Rotate
DoBalance(TreeNode
*pNode,
LLRotate(TreeNode
RRRotate(TreeNode
LRRotate(TreeNode
iLeftRight,
iSpecialFlag=0);
RLRotate(TreeNode
SwapTwoNodes(TreeNode
*pNode1,
TreeNode
*pNode2);
//Swap
their
value
only.
*m_pRoot;
CAVLTree:
CAVLTree()
m_pRoot
NULL;
~CAVLTree()
Stack
st(40);
//2^40
must
be
enough.
//Postorder
traverse
tree
release
all
nodes.
*pNode
m_pRoot;
*pTemp;
if(pNode==0)
return;
while
(1)
if(pNode->
pLeft!
st.Push(pNode);
pTemp
pNode;
pNode
pNode->
pTemp->
continue;
pRight!
if(0==st.Pop(pNode))
break;
//To
record
path.
*pIns;
iLeftOrRight;
left,
right.
if(pNode==0)
//Insert
at
this
position
*pNew
TreeNode(iVal);
*pPrev;
if(0!
=st.Top(pPrev))
if(0==iLeftOrRight)
pPrev->
pNew;
else
root
pIns
if(0==iLeftOrRight
=0
||
1==iLeftOrRight
=0)
//Need
change.
pIns;
if(iVal<
iData)
iLeftOrRight
if(iVal>
pMinBST;
pMinBSTParent;
iLRParent;
UpdateHeight(st,
iLRParent);
if(pMinBST!
//It
exists.
need
balance.
DoBalance(pMinBST,
iLRParent)
*pNode;
pMinBST
pMinBSTPar
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图解 数据结构 二叉 查找 平衡