鏈表實(shí)現(xiàn)二叉樹(shù)的類型聲明(Java):
/**
* 樹(shù)結(jié)構(gòu)
*/
public class TreeNode {
int value;
TreeNode leftTreeNode = null;
TreeNode rightTreeNode = null;
public TreeNode(int value) {
this.value = value;
this.leftTreeNode = null;
this.rightTreeNode = null;
}
}
二叉樹(shù)的構(gòu)建
public class BinaryTree {
private TreeNode rootNode;//二叉樹(shù)的根節(jié)點(diǎn)
public BinaryTree(int[] data) {
for (int i = 0; i < data.length; i++) {
addNodeToTree(data[I]);
}
}
//將指定的值加入到二叉樹(shù)中的適當(dāng)?shù)墓?jié)點(diǎn)
private void addNodeToTree(int value) {
TreeNode currentNode = rootNode;
if (rootNode == null) {//表示沒(méi)有根節(jié)點(diǎn)谬哀,建立根節(jié)點(diǎn)
rootNode = new TreeNode(value);
return;
}
//建立二叉樹(shù)
while (true) {
if (value < currentNode.value) {//在左子樹(shù)
if (currentNode.leftTreeNode == null) {
currentNode.leftTreeNode = new TreeNode(value);
return;
} else {
currentNode = currentNode.leftTreeNode;
}
} else {//在右子樹(shù)
if (currentNode.rightTreeNode == null) {
currentNode.rightTreeNode = new TreeNode(value);
return;
} else {
currentNode = currentNode.rightTreeNode;
}
}
}
}
}
調(diào)用(Kotlin寫法):
var data: IntArray = intArrayOf(6, 3, 5, 9, 7, 8, 4, 2)
BinaryTree(data)
二叉樹(shù)構(gòu)建過(guò)程分解:
第一步:i = 0 围橡,value = 6 哮缺, rootNode = null 創(chuàng)建一個(gè)value=6的節(jié)點(diǎn)荤崇,rootNode = 6
第二步:i = 1 ,value = 3 津函, rootNode值為6本辐,value < rootNode 潮太,放rootNode的左側(cè),而rootNode.leftTreeNode = null 所以創(chuàng)建一個(gè)value=3的節(jié)點(diǎn),賦值給rootNode的leftTreeNode
第三步:i = 2 谆构,value = 5 裸扶, rootNode值為6,value < rootNode 搬素,放rootNode的左側(cè)呵晨,然而 rootNode.leftTreeNode有值 =3 ,則value 與 rooNode.leltTreeNode進(jìn)行比較熬尺。將rooNode.leltTreeNode 賦值給currtentNode ,此次循環(huán)執(zhí)行完成摸屠,重新進(jìn)入循環(huán),此時(shí)currtentNode = 3 粱哼,value > currtentNode.value 則創(chuàng)建一個(gè)value=5的節(jié)點(diǎn),賦值給currtentNode的rightTreeNode
第四步:i = 3 季二,value = 9 , rootNode值為6揭措,value > rootNode 胯舷,放rootNode的右側(cè),rootNode.rightTreeNode = null 創(chuàng)建一個(gè)value=3的節(jié)點(diǎn),賦值給rootNode的rightTreeNode
第五步:i = 4 绊含,value = 7 需纳, rootNode值為6,value > rootNode 艺挪,放rootNode的右側(cè)不翩,然而 rootNode.rightTreeNode 有值,則value 與 rootNode.rightTreeNode進(jìn)行比較麻裳,將rootNode.rightTreeNode 賦值給currtentNode ,此次循環(huán)執(zhí)行完成口蝠,重新進(jìn)入循環(huán),此時(shí)currtentNode = 9 津坑,value < currtentNode.value 則創(chuàng)建一個(gè)value=7的節(jié)點(diǎn),賦值給currtentNode的leftTreeNode
第六步:i = 5 妙蔗,value = 8 , rootNode值為6疆瑰,value > rootNode 眉反,放rootNode的右側(cè)昙啄,然而 rootNode.rightTreeNode 有值,則value 與 rootNode.rightTreeNode進(jìn)行比較寸五,將rootNode.rightTreeNode 賦值給currtentNode ,此次循環(huán)執(zhí)行完成梳凛,重新進(jìn)入循環(huán),此時(shí)currtentNode = 9 梳杏,value < currtentNode.value 然而currtentNode.leftTreeNode有值 = 7 韧拒,所以將currentNode.leftTreeNode賦值給currentNode, 此次循環(huán)執(zhí)行完成,重新進(jìn)入循環(huán)十性,此時(shí)currtentNode = 7 叛溢,value > currtentNode.value 則創(chuàng)建一個(gè)value=8的節(jié)點(diǎn),賦值給currtentNode的rightTreeNode
第七步:i = 6 ,value = 4 劲适, rootNode值為6楷掉,value < rootNode ,放rootNode的左側(cè)霞势,然而 rootNode.leftTreeNode有值靖诗,則value 與 rooNode.leltTreeNode進(jìn)行比較,將rooNode.leltTreeNode 賦值給currtentNode ,此次循環(huán)執(zhí)行完成支示,重新進(jìn)入循環(huán)刊橘,此時(shí)currtentNode = 3 ,value > currtentNode.value 颂鸿,而currtentNode.value = 5促绵,則重新將currtentNode.value 賦值給currtentNode,此次循環(huán)執(zhí)行完成,重新進(jìn)入循環(huán)嘴纺,此時(shí)currtentNode = 5 败晴,value < currtentNode.value 則創(chuàng)建一個(gè)value=4的節(jié)點(diǎn),賦值給currtentNode的leftTreeNode
第八步:i = 7 ,value = 2 栽渴, rootNode值為6尖坤,value < rootNode ,放rootNode的左側(cè)闲擦,然而 rootNode.leftTreeNode有值慢味,則value 與 rooNode.leltTreeNode進(jìn)行比較,將rooNode.leltTreeNode 賦值給currtentNode ,此次循環(huán)執(zhí)行完成墅冷,重新進(jìn)入循環(huán)纯路,此時(shí)currtentNode = 3 ,value < currtentNode.value 則創(chuàng)建一個(gè)value=2的節(jié)點(diǎn),賦值給currtentNode的rightTreeNode