線索化二叉樹

2021-10-04 02:04:55 字數 2161 閱讀 7504

一、線索化二叉樹

其實本來這一節我是準備把堆排序給一口氣講完的,可是覺得堆排序的東西有點多,所以我們放到下一次單獨講堆排序。這一次呢我們講一下線索化二叉樹。

首先我們給出乙個乙個陣列。

然後再給出乙個順序儲存的結構

我們可以知道如果我們對它進行中序遍歷會得到。每乙個結點都有前驅結點和後繼結點。其實這個我講簡單點的話從陣列中我們就可以看出來 8的前面是空就說明沒有前驅結點,後繼結點是3.

3的前驅結點是8,後繼結點是10。以此類推。所以圖中我們可以畫出來

所以我們可以得到上圖。有人可能會問3 和 1 也有前驅和後繼為什麼沒有畫出來??原因是他的左右兩隻手都滿了。如果大家看明白了上面的兩幅圖,下面我上**。

public

class

heronode

public

void

setlefttype

(int lefttype)

public

intgetrighttype()

public

void

setrighttype

(int righttype)

public

heronode

(int no, string name)

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

class

tree

public

void

threadednodes()

//線索化二叉樹

public

void

threadednodes

(heronode node)

threadednodes

(node.

getleft()

);if(node.

getleft()

== null)

if( pre!=null && pre.

getright()

== null)

pre = node;

threadednodes

(node.

getright()

);}}

上面為實體類和樹裡面的**塊首先我們需要先判斷傳進來的物件是否為空,如果為空那還是直接return,就什麼事情都不做。如果不為空。我們遞迴查詢物件的左子節點。如果說物件的左子節點為空那麼我們就把物件的做自己點設為pre 因為開始我們定義了乙個空物件pre,型別改為1;

如果右子節點為空並且左子節點不為空,那麼我們把查到的前乙個物件的右子結點設為當前結點型別並改為1;這裡可能有點繞,需要理解一下。這裡我再講一下 ,可能有人不理解為什麼左右子節點都必須為空才能進入判斷呢???因為我們前面提到了只有左右手為空才有前驅結點和後繼結點。如果不為空那就沒有。我們也就沒有必要找了。到了最後最重要的一步就是把node賦值給pre這樣才能遞迴下去

!!!!!

其實感覺今天講得東西挺難理解的。自己也不太會講 ,希望各位能看的明白,看的舒服吧!!!

最後還是希望大家能夠指認我的錯誤,謝謝大家。希望能和大家一起共同進步!!!

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

1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...

線索化二叉樹

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

線索化二叉樹

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