線索化:二叉樹的左子節點指向的是「前驅節點」,右子節點指向的是「後繼節點」。
二叉樹的線索化有三種:前序、中序和後序線索化,見下圖:
下面是實現前序、中序和後序線索化的**實現:
**實現
定義node節點類
class
heronode
構建二叉樹
//定義threadedbinarytree 實現了線索化功能的二叉樹
class
threadedbinarytree
//過載threadednodes方法
public
void
threadednodes()
//過載prethreadednodes
public
void
prethreadednodes()
//過載postthreadednodes
public
void
postthreadednodes()
/** * 中序線索化二叉樹
** @param node 就是當前需要線索化的結點
*/public
void
threadednodes
(heronode node)
//(一)先線索化左子樹
threadednodes
(node.
getleft()
);//(二)線索化當前結點[有難度]
//處理當前結點的前驅結點
//以8結點來理解
//8結點的.left = null , 8結點的.lefttype = 1
if(node.
getleft()
== null)
//處理後繼結點
if(pre != null && pre.
getright()
== null)
//!!! 每處理乙個結點後,讓當前結點是下乙個結點的前驅結點
pre = node;
threadednodes
(node.
getright()
);}/**
* 前序線索化二叉樹
** @param node 就是當前需要線索化的結點
*/public
void
prethreadednodes
(heronode node)
if(node.
getleft()
== null)
if(pre != null && pre.
getright()
== null)
pre = node;
//向左線索化二叉樹
if(node.
getlefttype()
==0)//向右線索化二叉樹
if(node.
getrighttype()
==0)}
/** * 後序線索化二叉樹
** @param node 就是當前需要線索化的結點
*/public
void
postthreadednodes
(heronode node)
//設定父節點,後序線索化遍歷時需要
if(node.
getleft()
!= null)
else
if(node.
getright()
!= null)
postthreadednodes
(node.
getleft()
);postthreadednodes
(node.
getright()
);if(node.
getleft()
== null)
if(pre != null && pre.
getright()
== null)
pre = node;
}//下面是遍歷方法
//遍歷中序線索化二叉樹的方法
public
void
threadedlist()
//列印當前這個結點
system.out.
println
(node)
;//如果當前結點的右指標指向的是後繼結點,就一直輸出
while
(node.
getrighttype()
==1)//替換這個遍歷的結點
node = node.
getright()
;}}/**
* 遍歷前序線索化二叉樹
*/public
void
prethreadedlist()
else}}
/** * 遍歷後序線索化二叉樹
*/public
void
postthreadedlist()
heronode prenode = null;
while
(node != null)
else
prenode = node;
node = node.
getparent()
;}else}}}}}
後序線索化遍歷的思路: 二叉樹線索化以及線索化前序 中序 後序遍歷
二叉樹線索化以及線索化前序 中序 後序遍歷 前面已經對二叉樹的建立與建立有了一定了解,那二叉樹的線索化又是什麼呢?二叉樹雖然是非線性結構,但二叉樹的遍歷卻為二叉樹的節點匯出了乙個線性序列。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼...
線索化二叉樹 前中後序線索化及前序中序遍歷
pragma once includeusing namespace std enum pointinfo 儲存節點線索資訊 templatestruct binarytreenodethd templateclass binarytreethd binarytreethd t arr,size t...
線索化二叉樹(前序線索化,中序線索化)
為什麼要對二叉樹進行線索化?對二叉樹進行遍歷是以一定的規則將二叉樹的節點排列成乙個線性序列,這些線性序列有且僅有乙個直接前驅和直接後繼,但是以二叉鍊錶進行儲存的時候,只能找到節點的左右孩子資訊,不能直接得到節點在任一串行的前驅和後繼資訊,前驅和後繼資訊只能在遍歷的動態過程中才能得到。如何獲取到前驅和...