線索二叉樹原理及前序 中序線索化(Java版)

2021-08-20 10:45:58 字數 2401 閱讀 6299

class

node

/**

*@title: 二叉樹相關操作

*@description:

*@author: uncle ming

*@date:2023年1月6日 下午2:49:14

*@version v1.0

*/public

class

threadbinarytree

}/**

* 通過陣列構造乙個二叉樹(完全二叉樹)

*@param array

*@param index

*@return

*/static node createbinarytree(string array, int index)

return node;

}/**

* 中序線索化二叉樹

*@param node 節點

*/void inthreadorder(node node)

//處理左子樹

inthreadorder(node.left);

//左指標為空,將左指標指向前驅節點

if(node.left == null)

//前乙個節點的後繼節點指向當前節點

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

prenode = node;

//處理右子樹

inthreadorder(node.right);

}/**

* 中序遍歷線索二叉樹,按照後繼方式遍歷(思路:找到最左子節點開始)

*@param node

*/void inthreadlist(node node)

while(node != null) else }}

}/**

* 中序遍歷線索二叉樹,按照前驅方式遍歷(思路:找到最右子節點開始倒序遍歷)

*@param node

*/void inprethreadlist(node node)

while(node != null) else }}

}/**

* 前序線索化二叉樹

*@param node

*/void prethreadorder(node node)

//左指標為空,將左指標指向前驅節點

if(node.left == null)

//前乙個節點的後繼節點指向當前節點

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

prenode = node;

//處理左子樹

if(!node.isleftthread)

//處理右子樹

if(!node.isrightthread)

}/**

* 前序遍歷線索二叉樹(按照後繼線索遍歷)

*@param node

*/void prethreadlist(node node)

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

node = node.right;}}

public

static

void

main(string args) ;

node root = createbinarytree(array, 0);

threadbinarytree tree = new threadbinarytree();

tree.inthreadorder(root);

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

tree.inthreadlist(root);

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

tree.inprethreadlist(root);

node root2 = createbinarytree(array, 0);

threadbinarytree tree2 = new threadbinarytree();

tree2.prethreadorder(root2);

tree2.prenode = null;

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

tree.prethreadlist(root2);

}}

線索化的過程就是修改二叉鍊錶中空指標的過程,可以按照前序、中序、後序的方式進行遍歷,分別生成不同的線索二叉樹;

有了線索二叉樹之後,我們再次遍歷時,就相當於操作乙個雙向鍊錶。

使用場景:如果我們在使用二叉樹過程中經常需要遍歷二叉樹或者查詢節點的前驅節點和後繼節點,可以考慮採用線索二叉樹儲存結構。

線索化二叉樹(前序線索化,中序線索化)

為什麼要對二叉樹進行線索化?對二叉樹進行遍歷是以一定的規則將二叉樹的節點排列成乙個線性序列,這些線性序列有且僅有乙個直接前驅和直接後繼,但是以二叉鍊錶進行儲存的時候,只能找到節點的左右孩子資訊,不能直接得到節點在任一串行的前驅和後繼資訊,前驅和後繼資訊只能在遍歷的動態過程中才能得到。如何獲取到前驅和...

線索化二叉樹 前中後序線索化及前序中序遍歷

pragma once includeusing namespace std enum pointinfo 儲存節點線索資訊 templatestruct binarytreenodethd templateclass binarytreethd binarytreethd t arr,size t...

中序線索化二叉樹

線索化二叉樹。1 中序線索化二叉樹 2 遍歷線索化二叉樹。include include define maxsize 100 typedef char elemtype using namespace std typedef struct node tbtnode 對以 p為根節點的二叉樹中序線索...