基於陣列完成順序二叉樹

2022-08-01 15:21:16 字數 1673 閱讀 6150

給定乙個陣列a[maxsize],若父結點為a[k] (k != 0),則其左子結點為a[2k],右子結點為a[2k+1],左子結點的左子結點為a[(2^2)*k],左子結點的右子結點為a[(2^2)*k+1],右子結點的左子結點為a[(2^2)*k+2],右子結點的右子結點為a[(2^2)*k+3]......

可以推導出,深度為n的第乙個結點的左子結點(位於n+1層)為a[(2^n)*k],另乙個子結點即右子結點為a[2^n)*k+1]

那麼我們要求出深度為n+1時的任一結點,只要將其陣列下標與深度的關係得出即可列出乙個等式,令返回值==等式值即可,時間複雜度為o(1)

通過上圖我們發現如果完全二叉樹的乙個父結點編號為k,那麼它左兒子的編號就是2*k,右兒子的編號就是2*k+1。如果已知兒子(左兒子或右兒子)的編號是x,那麼它父結點的編號就是x/2,注意這裡只取商的整數部分。在c語言中如果除號『/』兩邊都是整數的話,那麼商也只有整數部分(即自動向下取整),即4/2和5/2都是2。另外如果一棵完全二叉樹有n個結點,那麼這個完全二叉樹的高度為log2 n簡寫為log n,即最多有log n層結點。

public

class

arrbinarytree

/*順序儲存二叉樹

*//**

* * @description:前序遍歷

* @params:1.陣列下標

* @return

: *

@author

: 蘇興旺

* @time: 2020/3/13 14:25

*/public

void preorder(int

index)

/*輸出當前元素

*/system.out.println(arr[index]);

//左遞迴遍歷

if (index*2+1//右遞迴遍歷

if (index*2+2}

/*中序遍歷

*/public

void infixorder(int

index)

//輸出當前節點

system.out.println(arr[index]);

//右遞迴

if (index*2+2}

/*後序遍歷

*/public

void postorder(int

index)

//右遞迴

if (index*2+2//當前節點

system.out.println(arr[index]);

}

public

class

arrbinarytreedemo ;

arrbinarytree arrbinarytree = new

arrbinarytree(arr);

/*//前序遍歷

system.out.println("前序遍歷:");

arrbinarytree.preorder(0);

//中序遍歷

system.out.println("中序遍歷:");

arrbinarytree.infixorder(0);

//後序遍歷

system.out.println("後序遍歷:");

arrbinarytree.postorder(0);*/}

}

陣列順序儲存二叉樹

一般先判斷 陣列是否為空,然後再判斷長度是否為0,因為可能報空指標異常。不初始化的時候,預設是null。所以如果在一行 中要同時判斷的時候需要這樣寫 if array null array.length 0 注意 是度短路,如果為空,後面就不判斷了。package com public class ...

順序二叉樹

從資料儲存來看,陣列儲存方式和樹的儲存方式可以相互轉換,即陣列可 以轉換成樹,樹也可以轉換成陣列。順序二叉樹通常只考慮完全二叉樹 第n個元素的左子節點為 2 n 1 第n個元素的右子節點為 2 n 2 第n個元素的父節點為 n 1 2 n 表示二叉樹中的第幾個元素 按0開始編號如圖所示 相當於陣列的...

陣列二叉樹

要求 現給一串數字,按照順序從根插入到二叉樹中。但是插入的過程要注意,左子樹的值要小於等於父節點,右子樹的值要大於父節點。例如,序列為1 3 4 2 3 0,插入對應的二叉樹為 1 0 3 2 4 3 建好二叉樹後,從根開始輸出每行數字,每層按照從左到右的順序輸出。輸入 第一行為數字序列長度n 1 ...