資料結構之 線索二叉樹

2021-10-23 07:08:25 字數 3835 閱讀 5352

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,...