数据结构——顺序存储二叉树
生活随笔
收集整理的這篇文章主要介紹了
数据结构——顺序存储二叉树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
因為從數據存儲的角度來看,數組存儲方式和樹的存儲方式是可以互相轉換的,即數組可以轉換為樹,而樹也可以轉換成數組。
八大排序算法中的堆排序,就會使用到順序存儲二叉樹,后面在堆排序算法中會體現出來。
1. 什么叫作順序存儲二叉樹
當一顆二叉樹滿足如下兩個條件時,就是順序存儲二叉樹:
二叉樹是以數組的方式存放數據的。如下圖所示:
在遍歷數組時,仍然可以按照前序遍歷、中序遍歷和后序遍歷的方式來完成節點的遍歷
2. 順序存儲二叉樹的特點
順序二叉樹通常只考慮完全二叉樹
第n個元素的左子節點在數組中對應的下標是2*n + 1
第n個元素的右子節點在數組中對應的下標是2*n + 2
第n個元素的父節點在數組中對應的下標是(n - 1)/2
其中n表示二叉樹中的第幾個元素(按照數組中的下標0開始)。
結合順序二叉樹的示意圖說明:
例如上面二叉樹中的2這個節點:
-
節點2—>在數組中對應的下標是1—>那么它的左子節點的下標為2*1 + 1 = 3,就是節點4這個對象,它的右子節點的下標為2x1+2 = 4,就是節點5這個對象。
-
節點3—>在數組中對應的下標是2—>那么它的左子節點的下標為2*2 + 1 = 5,就是節點6這個對象,它的右子節點的下標為2x2+2 = 6,就是節點7這個對象。
-
節點5—>在數組中對應的下標是4—>那么他的父節點的下標為(4-1)/2 = 1,即它的父節點在數組中的下標為1
3. 順序存儲二叉樹前序、中序、后序遍歷
代碼實現
//編寫一個ArrayBinaryTree,實現順序存儲二叉樹遍歷 class ArrayBinaryTree {private int[] arr;public ArrayBinaryTree(int[] arr) {this.arr = arr;}//重載preOrder方法public void preOrder() {this.preOrder(0);}/*** 順序存儲二叉樹的前序遍歷* @param index 數組的下標*/public void preOrder(int index) {if (arr == null || arr.length == 0) {System.out.println("數組為空,不能按照二叉樹的前序遍歷");return;}//1. 輸出當前這個元素System.out.print(arr[index] + "\t");//2. 向左遞歸遍歷if ((index * 2 + 1) < arr.length) {preOrder(index * 2 + 1);}//3. 向右遞歸遍歷if ((index * 2 + 2) < arr.length) {preOrder(index * 2 + 2);}}/*** 順序存儲二叉樹的中序遍歷* @param index 數組的下標*/public void infixOrder(int index) {if (arr == null || arr.length == 0) {System.out.println("數組為空,不能按照二叉樹的中序遍歷");return;}//1. 向左遞歸遍歷if ((index * 2 + 1) < arr.length) {infixOrder(index * 2 + 1);}//2. 輸出當前這個元素System.out.print(arr[index] + "\t");//3. 向右遞歸遍歷if ((index * 2 + 2) < arr.length) {infixOrder(index * 2 + 2);}}/*** 順序存儲二叉樹的后序遍歷* @param index 數組的下標*/public void postOrder(int index) {if (arr == null || arr.length == 0) {System.out.println("數組為空,不能按照二叉樹的后序遍歷");return;}//1. 向左遞歸遍歷if ((index * 2 + 1) < arr.length) {postOrder(index * 2 + 1);}//2. 向右遞歸遍歷if ((index * 2 + 2) < arr.length) {postOrder(index * 2 + 2);}//3. 輸出當前這個元素System.out.print(arr[index] + "\t");} }測試代碼
public class ArrayBinaryTreeDemo {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7};//創建一個ArrayBinaryTreeArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr);System.out.println("順序存儲二叉樹前序遍歷");arrayBinaryTree.preOrder();System.out.println("\n順序存儲二叉樹中序遍歷");arrayBinaryTree.infixOrder(0);System.out.println("\n順序存儲二叉樹后序遍歷");arrayBinaryTree.postOrder(0);} }運行結果
非常感謝您的耐心閱讀,希望我的文章對您有幫助。歡迎點評、轉發或分享給您的朋友或技術群。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的数据结构——顺序存储二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自定义控件——轮播广告条
- 下一篇: volatile的学习总结