二叉樹 三 線索化二叉樹

2021-10-03 08:59:05 字數 2709 閱讀 4488

1.1 先看乙個問題

將數列 構建成一顆二叉樹.

問題分析:

當我們對上面的二叉樹進行中序遍歷時,數列為

但是 6, 8, 10, 14 這幾個節點的 左右指標,並沒有完全的利用上.

如果我們希望充分的利用 各個節點的左右指標, 讓各個節點可以指向自己的前後節點,怎麼辦?

解決方案-線索二叉樹

1.2 線索二叉樹基本介紹

n 個結點的二叉鍊錶中含有n+1(n個結點共有2n個指標域,其中非root的每乙個節點都連著乙個指標域,故剩餘【2n -(n - 1)】個指標域) 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標(這種附加的指標稱為"線索")

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

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

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

1.3 線索二叉樹應用案例

應用案例說明:將下面的二叉樹,進行中序線索二叉樹。中序遍歷的數列為

思路分析: 中序遍歷的結果:

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

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

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

故需要在原本node的**中新增 lefttype、righttype;並約定:如果lefttype == 0 表示指向的是左子樹,如果1表示指向的是前驅結點;如果righttype == 0 表示指向的是右字樹,如果1表示指向的後繼結點。

**實現

/ 先建立heronode節點

class heronode

public void setlefttype(int lefttype)

public int getrighttype()

public void setrighttype(int righttype)

public heronode(int no, string name)

public int getno()

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()

}

class threadedbinarytree 

public void threadednodes()

public void threadednodes(heronode node)

// 1.先線索化左子樹

threadednodes(node.getleft());

// 2.線索化當前結點

if (node.getleft() == null)

// 處理後繼結點

if (pre != null && pre.getright() == null)

// 讓當前結點是下乙個節點的前驅結點

pre = node;

// 3.線索化右子樹

threadednodes(node.getright());

}}

1.4 遍歷線索化二叉樹

說明:對前面的中序線索化的二叉樹, 進行遍歷

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

遍歷線索化二叉樹**實現:

// 遍歷線索化二叉樹的方法

public void threadedlist()

// 列印當前這個結點

system.out.println(node);

// 如果當前結點的右指標指向的是後繼結點一直輸出

while (node.getrighttype() == 1)

// 替換這個遍歷的結點

node = node.getright();

} }

public class threadedbinarytreedemo 

}

執行結果如下:

二叉樹(三) 線索二叉樹

對於具有n個結點的二叉樹,二叉鍊錶中空的指標域數目為n 1,如下圖 注 n 1 的推導過程如下 2 n n 1 n 1 利用二叉鍊錶中空的指標域指出結點在某種遍歷序列中的直接前驅或直接後繼。指向前驅和後繼的指標稱為線索,加了線索的二叉樹稱為線索二叉樹。利用鏈結點的空的左指標域存放該結點的直接前驅的位...

(C )二叉樹的線索化 線索二叉樹

線索化標誌tag enum pointertag 結點結構 template struct binarytreenodethd 基類迭代器 template struct binarytreeiterator t operator t operator bool operator const sel...

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

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