線索二叉樹的理解和實現 Java

2021-09-11 05:47:21 字數 2948 閱讀 1914

線索二叉樹的基本概念

我們按某種方式對二叉樹進行遍歷,將二叉樹中所有節點排序為乙個線性序列,在該序列中,除第乙個結點外每個結點有且僅有乙個直接前驅結點;除最後乙個結點外每乙個結點有且僅有乙個直接後繼結點。

在有n個節點的二叉樹中需要利用n+1個空指標新增線索,這是因為在n個節點的二叉樹中,每個節點有2個指標,所以一共有2n個指標,除了根節點以外,每乙個節點都有乙個指標從它的父節點指向它,所以一共使用了n-1個指標,所以剩下2n-(n-1)也就是n+1個空指標;

我們利用這些空指標域來存放指向該節點的直接前驅或是直接後繼的指標,則可由此資訊直接找到在該遍歷次序下的前驅結點或後繼結點,從而比遞迴遍歷提高了遍歷速度,節省了建立系統棧所使用的儲存空間;

這些被重新利用起來的空指標就被稱為線索(thread),加上了這些線索的二叉樹就是線索二叉樹

根據線索性質的不同,線索二叉樹可以分為前序線索二叉樹,中序線索二叉樹,後序線索二叉樹。

記node指向二叉鍊錶中的乙個結點,以下是建立線索的規則:

(1)如果node的左指標域為空,則存放指向某種遍歷序列中該結點的前驅結點,這個結點稱為node的前驅;

(2)如果node的右指標域為空,則存放指向中序遍歷序列中該結點的後繼結點。這個結點稱為node的後繼;

**實現

修改二叉樹節點資料結構,節點類:

package 線索二叉樹;

public class cluenode

public cluenode(object data, cluenode left, cluenode right, boolean leftisthread, boolean rightisthread)

public object getdata()

public void setdata(object data )

public cluenode getleft()

public void setleft(cluenode left)

public boolean isleftisthread()

public void setleftisthread(boolean leftisthread)

public cluenode getright()

public void setright(cluenode right)

public boolean isrightisthread()

public void setrightisthread(boolean rightisthread)

public boolean equals(object o)

else return false; }

}

線索二叉樹類:

package 線索二叉樹;

public class clueforktree

else return null; }

//中序線索化二叉樹

public void inthreading(cluenode node)

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

prenode = node;

inthreading(node.getright()); }

//中序按後繼方式遍歷線索二叉樹

public void inthreadlist(cluenode node)

while(node != null)

else

}} }

//中序按前驅方式遍歷線索二叉樹

public void inprethreadlist(cluenode node)

while(node != null)

else

}} }

//前序線索化二叉樹

public void inthfrontreading(cluenode node)

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

prenode = node;

if(!node.isleftisthread())

if(!node.isrightisthread())

} //前序按後繼方式進行遍歷二叉樹

public void prethreadlist(cluenode node)

system.out.print(node.getdata() + ",");

node = node.getright();

} }public static void main(string args) ;

cluenode root = createclueforktree(array, 0);

clueforktree tree = new clueforktree();

tree.inthreading(root);

system.out.println("中序按後繼節點遍歷線索二叉樹結果:");

tree.inthreadlist(root);

system.out.println("\n中序按前驅節點遍歷線索二叉樹結果:");

tree.inprethreadlist(root);

cluenode root1 = createclueforktree(array, 0);

tree.inthfrontreading(root1);

tree.prenode = null;

system.out.println("\n前序按後繼節點遍歷線索二叉樹結果:");

tree.prethreadlist(root1);

}}

線索化二叉樹理解

線索化二叉樹 我的理解就是將乙個複雜的非線性結構轉化為線性結構,使每個節點都有前驅節點和後繼節點。解決 解決了無法找到該節點在某種遍歷序列的前驅和後繼節點的問題,解決了二叉鍊錶找左右節點的問題。這裡我選擇了中序線索化,並只粘出了關鍵 進行理解分析 節點物件 public class hero pub...

線索二叉樹的實現

include include typedef char elemtype 線索儲存標誌位 link 0 表示指向左右孩子的指標 link 1 表示指向前驅後繼的線索 typedef enum pointertag typedef struct bithrnodebithrnode,bithrtre...

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

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