2、線索二叉樹**實現
對於一顆二叉樹而言(如下圖所示),每次我們想要查詢二叉樹裡面的乙個節點的時候,我們都必須遍歷這棵樹,以中序遍歷為例,遍歷的順序為4251637,當我們遍歷到標號為5這個節點的時候,如果有個指標指向5的前乙個節點2或者後乙個節點1的話,那麼我們跳轉到2或者1的效率肯定會大大的提公升,那我們在**去建立這種指標呢?剛好我們的二叉樹除了父節點以外,其它的每乙個節點都有乙個節點指向它,意味著二叉樹有(n-1)條鏈被使用,而我們的二叉樹一共有2n條鏈,所以二叉樹會有 2n-(n-1) = n+1 條空鏈,這n+1條空鏈存在這空間浪費的情況。所以線索二叉樹就是為了合理使用這n+1條空鏈域而產生的一種資料結構。
線索二叉樹的建立
package cluebinary;
/** * 二叉樹物件
*/public
class
cluenode
<
t>
public cluenode<
t>
getleftnode()
public boolean islflag()
public
void
setlflag
(boolean lflag)
public boolean isrflag()
public
void
setrflag
(boolean rflag)
public
void
setleftnode
(cluenode<
t> leftnode)
public cluenode<
t>
getrightnode()
public
void
setrightnode
(cluenode<
t> rightnode)
/** * 前序遍歷
*/public
void
frontshow()
//列印根節點
system.out.
println
(this
.value);if
(this
.leftnode !=
null)if
(this
.rightnode !=
null)}
/** * 中序遍歷
*/public
void
middelshow()
if(this
.leftnode !=
null
)//列印根節點
system.out.
println
(this
.value);if
(this
.rightnode !=
null)}
/** * 後續遍歷
*/public
void
aftershow()
if(this
.leftnode !=
null)if
(this
.rightnode !=
null
)//列印根節點
system.out.
println
(this
.value);}
/** * 前序查詢
** @param value
*/public cluenode frontsearch
(t value)if(
this
.leftnode !=
null)if
(treenode !=
null)if
(this
.rightnode !=
null
)return treenode;
}/**
* 前序查詢
** @param value
*/public cluenode middlesearch
(t value)
if(treenode !=
null)if
(this
.value == value)if(
this
.rightnode !=
null
)return treenode;
}/**
* 前序查詢
** @param value
*/public cluenode aftersearch
(t value)
if(treenode !=
null)if
(this
.rightnode !=
null)if
(treenode !=
null)if
(this
.value == value)
return treenode;
}}
線索二叉樹的線索化,和遍歷方法,**以中序遍歷為例,二叉樹線索化後,呼叫中序遍歷與呼叫線索化threadnodes()後呼叫遍歷線索二叉樹方法threaditerate()的結果是一樣的。
package cluebinary;
/** * 線索二叉樹
*/public
class
cluebinarytree
<
t>
/** * 遍歷線索二叉樹
*/public
void
threaditerate()
// 列印當前節點
system.out.
println
(node.
getvalue()
);//如果當前節點的右指標指向的的是後繼節點,迴圈找到最後乙個
while
(node.
isrflag()
)//替換遍歷的節點
node = node.
getrightnode()
;}}}
/** * 中序線索化二叉樹
*/public
void
threadnodes()
/** * 遍歷線索二叉樹
* @param node
*/public
void
threadnodes
(cluenode<
t> node)
// 處理左子樹
threadnodes
(node.
getleftnode()
);//處理前驅節點
if(node.
getleftnode()
==null
)//處理前驅節點的右指標
if(pre!=
null
&& pre.
getrightnode()
==null
) pre = node;
//處理右子樹
threadnodes
(node.
getrightnode()
);}/**
* 中序遍歷
*/public
void
middleshow()
/** * 前序遍歷
*/public
void
frontshow()
root.
frontshow();}}
資料結構之線索二叉樹
應用案例說明 將下面的二叉樹,進行中序線索二叉樹。中序遍歷的數列為 定義threadedbinarytree 實現了線索化功能的二叉樹 class threadedbinarytree 過載一把threadednodes方法 public void threadednodes 遍歷線索化二叉樹的方法...
線索二叉樹 資料結構
按照教材進行中序二叉樹線索化 線索化就是就將二叉樹的多出來的n 1個鏈域用做指向前驅和後繼用,前驅後繼指的是按中序遍歷二叉樹產生的前驅和後繼 ltag 0 有左孩子 ltag 1 無左孩子,指向前驅 rtag 0 有右孩子 rtag 1 無右孩子,指向後繼 例子 構造二叉樹 形如abc de fg ...
資料結構(線索二叉樹)
線索二叉樹的前序,中序,後序 typedef struct nodenode 前序線索二叉樹 參照中序即可 void prethread node p,node pre if pre null pre rchild null pre p if p ltag 0 prethread p lchild,...