線索化二叉樹以及遍歷線索化二叉樹

2021-10-07 21:59:28 字數 3164 閱讀 3923

1.線索二叉樹基本介紹

n個結點的二叉鍊錶中含有n+1 【公式 2n-(n-1)=n+1】 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標(這種附加的指標稱為"線索")

這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹(threaded binarytree)。根據線索性質的不同,線索二叉樹可分為前序線索二叉樹、中序線索二叉樹和後序線索二叉樹三種

乙個結點的前乙個結點,稱為前驅結點

乙個結點的後乙個結點,稱為後繼結點

2.中序線索二叉樹

將下面的二叉樹,進行中序線索二叉樹。中序遍歷的數列為

說明: 當線索化二叉樹後,node節點的 屬性 left 和 right ,有如下情況:

left 指向的是左子樹,也可能是指向的前驅節點. 比如 ① 節點 left 指向的左子樹, 而 ⑩ 節點的 left 指向的就是前驅節點.

right指向的是右子樹,也可能是指向後繼節點,比如 ① 節點right 指向的是右子樹,而⑩ 節點的right 指向的是後繼節點.

線索化二叉樹**看下面

3.因為線索化後,各個結點指向有變化,因此原來的遍歷方式不能使用,這時需要使用新的方式遍歷線索化二叉樹,各個節點可以通過線型方式遍歷,因此無需使用遞迴方式,這樣也提高了遍歷的效率。 遍歷的次序應當和中序遍歷保持一致。
package threadebinarytree;

public

class

threadedbinarytreedemo

}//建立線索二叉樹類 threadedbinarytree

class

threadedbinarytree

public

void

threadedbinarytree()

//中序線索化二叉樹

public

void

threadedbinarytree

(heronode node)

//1、線索化左子節點

threadedbinarytree

(node.

getleft()

);//2、線索化當前結點(難點)

//處理當前結點的前驅結點

if(node.

getleft()

== null)

//處理當前結點的後繼結點

if(pre != null && pre.

getright()

== null)

pre = node;

//3、線索化右子結點

threadedbinarytree

(node.

getright()

);}//遍歷 中序線索化二叉樹

public

void

threadedlist()

//列印當前結點

system.out.

println

(node)

;//如果當前結點的有指標指向的是後繼結點,則一直輸出

while

(node.

getrighttype()

==1)//替換這個遍歷的結點

node = node.

getright()

;}}//前序遍歷

public

void

preorder()

else

}//中序遍歷

public

void

infixorder()

else

}//後序遍歷

public

void

postorder()

else}}

//建立結點類

class

heronode

public

intgetlefttype()

public

void

setlefttype

(int lefttype)

public

intgetrighttype()

public

void

setrighttype

(int righttype)

public

intgetno()

public

void

setno

(int no)

public string getname()

public

void

setname

(string name)

public heronode getleft()

public

void

setleft

(heronode left)

public heronode getright()

public

void

setright

(heronode right)

@override

public string tostring()

';}//前序遍歷的遞迴實現

public

void

preorder()

//遞迴向右子樹前序遍歷if(

this

.right != null)

}//中序遍歷的遞迴實現

public

void

infixorder()

//輸出父節點

system.out.

println

(this);

//遞迴向右子樹中序遍歷if(

this

.right != null)

}//後序遍歷的遞迴實現

public

void

postorder()

//遞迴向右子樹後續遍歷if(

this

.right != null)

//輸出父節點

system.out.

println

(this);

}}

遍歷線索化二叉樹

常規的線索化方式 採用遞迴地呼叫的方式,判定條件是當前指標的左子樹是否為空 實現 public void midorder system.out.println this if this right null 對比 但是對二叉樹進行線索化之後,不存在空的左右指標,但是單獨設定每乙個指標的型別,故而條...

線索化二叉樹

define crt secure no warnings 1 includeusing namespace std enum pointertag 列舉 其結構如下 void prevorderthreading 前序 void postorderthreading 後序 void inorder...

線索化二叉樹

二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊.二叉樹的結...