從資料儲存來看,陣列儲存方式和樹的儲存方式可以相互轉化,陣列可以轉化成樹,樹也可以轉化成陣列。
順序儲存二叉樹的特點:
順序二叉樹通常只考慮完全二叉樹。
第n個元素的左子節點 2 * n + 1
第n個元素的右子節點 2 * n + 2
第n個元素的父節點為 (n-1) / 2
n :表示二叉樹中的第幾個元素(按0開始編號)
**實現前序遍歷(陣列形式):
//index 代表下標 預設0
public
void
preorder
(int index)
system.out.
println
(arr[index]);
//左遞迴
if(index *2+
1< arr.length)
preorder
(index *2+
1);//右遞迴
if(index *2+
2< arr.length)
preorder
(index *2+
2);}
1245367
二叉樹可以使用兩種儲存結構:順序儲存和二叉鍊錶。在使用二叉鍊錶的儲存結構的過程中,會存在大量的空指標域,為了充分利用這些空指標域,引申出了「線索二叉樹」。
n個節點的二叉鍊錶含有n+1個空指標域。利用二叉鍊錶中的空指標域存放該節點在某種遍歷次序下的前驅和後繼節點指標。
這種加上線索的二叉鍊錶成為線索鍊錶,相應的二叉樹成為線索二叉樹,根據線索性質的不同,線索二叉樹可分為前序線索二叉樹, 中序線索二叉樹和後序線索二叉樹。
乙個節點的前乙個節點,稱為前驅節點。
乙個節點的後乙個節點, 稱為後續節點。
**實現 中序二叉樹:
思路:
left 指的可能是左子樹也可能是前驅節點。因此要設定乙個變數來判斷其為左子樹還是前驅節點。right同理。
當前節點的左指標指向前驅節點, 前驅節點的右指標指向當前節點。
//中序線索化二叉樹
public
void
threadinfixtree
(node node)
//處理後續節點: 前驅節點的右指標指向當前節點
if(pre != null && pre.
getright()
== null)
// 將此節點作為下一次的前序節點.
pre = node;
// 處理右子樹
threadinfixtree
(node.
getright());}
遍歷中序線索化二叉樹:思路:
找到 isleftthread == true的點。
最先找到的是最左子樹點,列印當前節點。
如果當前節點的右指標是後續節點 isrightthread = =true 就一直輸出
替換遍歷的點
//遍歷
public
void
threadlist()
//列印當前節點
system.out.
println
(node)
;//如果當前節點的右節點是後續節點那麼就一種輸出
while
(node.
isrightthread()
)//替換遍歷的點
node = node.
getright();}}
資料結構與演算法 樹與二叉樹
樹是若干個結點組成的有限集合,其中必須有乙個結點是根結點,其餘結點劃分為若干個互不相交的集合,每乙個集合還是一棵樹,稱為根的子樹。當樹的結點個數為0時,我們稱這棵樹為空樹,記為 關於樹的基本術語 結點 表示樹中的元素,包括資料項和若干指向其子樹的分支 結點的度 結點所擁有的子樹的個數 葉子結點 度為...
演算法與資料結構 二叉樹
二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...
資料結構與演算法 二叉樹
1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...