學點演算法(十一) 將二叉樹轉為陣列

2021-10-09 16:11:14 字數 3437 閱讀 9585

今天我們來學習如何將二叉樹轉為陣列(填坑學點演算法(九)——二叉樹中序遍歷演算法(遞迴實現))。

首先,我們看下面這棵二叉樹,我們從根節點出發,左右孩子依次排列在根節點後面,放入陣列中,然後繼續以同樣的方法遍歷其左右孩子,如果孩子節點的位置已經被叔父節點佔據,則繼續排在叔父節點後面,如果遇到沒有左右孩子的情況,則將沒有的節點置為null,將節點排列在陣列中,直至遍歷結束,位於陣列結尾的null(後面沒有有效節點值)可去除。

我們來看下這個過程:

首先我們放入1及其左右孩子,得到[1, 2, 3]

1的左孩子2的左右孩子,因為2後面的位置被3佔據了,所以4, 5需要排在3後面,得到[1, 2, 3, 4, 5]

1的右孩子3的左右孩子,因為3後面的位置被4, 5佔據了,所以6, 7需要排在4, 5後面,得到[1, 2, 3, 4, 5, 6, 7]

4 5 6 7沒有孩子節點,全部置為null,得到[1, 2, 3, 4, 5, 6, 7, null, null, null, null]因為null值都位於末尾,所以得到[1, 2, 3, 4, 5, 6, 7]

通過這個過程,可以發現節點的位置就是先到先得,誰先遇到了,就佔據了這個位置,後面來的節點都往後排,這個過程跟佇列的先進先出是一樣的,所以我們很容易想到可以用佇列來儲存遇到的節點,並依次將它放到陣列中。

/**

* 將二叉樹轉為陣列(二叉樹層次遍歷)

* @param root 二叉樹根節點

* @param 二叉樹元素型別

* @return 陣列

*/@suppresswarnings

("unchecked"

)public

static

comparable

> t[

]converttree2array

(binarytreenode

root)

// 由於不知道陣列長度,先將元素存入list中

list

list =

newarraylist

<

>()

; binarytreenode

currentnode = root;

deque

> queue =

newarraydeque

<

>()

;// 建立乙個特殊物件來儲存null

binarytreenode

null =

newbinarytreenode

<

>

(null);do

else

// 獲取右子樹節點

binarytreenode

rightchild = currentnode.rightchild;

if(rightchild == null)

else

}// 從佇列中取出下乙個節點

currentnode = queue.

poll()

;// 如果currentnode為null,表示沒有剩餘元素了,可退出迴圈

}while

(currentnode != null)

;return list.

toarray

((t[

]) array.

newinstance

(root.data.

getclass()

,0))

;}

**中要注意的是null這個特殊物件,這個物件表示此處沒有節點,但是在陣列中我們還是需要放置乙個null來表示,所以單獨使用了乙個特殊物件來存這個值。

測試**如下:

binarytreenode

one =

newbinarytreenode

<

>(1

);binarytreenode

two =

newbinarytreenode

<

>

(one,2)

;binarytreenode

three =

newbinarytreenode

<

>

(one,3)

;one.leftchild = two;

one.rightchild = three;

binarytreenode

four =

newbinarytreenode

<

>

(two,4)

;binarytreenode

five =

newbinarytreenode

<

>

(two,5)

;two.leftchild = four;

two.rightchild = five;

binarytreenode

six =

newbinarytreenode

<

>

(three,6)

;binarytreenode

seven =

newbinarytreenode

<

>

(three,7)

;three.leftchild = six;

three.rightchild = seven;

integer[

] arr =

converttree2array

(one)

;// 因為陣列後面的null不影響資料,為了方便測試,將陣列後面的null值都去掉

int idx = arr.length -1;

while

(arr[idx]

== null)

integer[

] nullfilteredarr = arrays.

copyof

(arr, idx +1)

;assertarrayequals

(new

integer

, nullfilteredarr)

;

演算法 將二叉樹轉為映象

題目描述 操作給定的二叉樹,將其變換為源二叉樹的映象。輸入描述 二叉樹的映象定義 源二叉樹 映象二叉樹 採用遞迴思想 套先序遍歷模板 如果乙個節點不是葉節點,則將它的左右孩子互換 接著將它的左右孩子都轉為映象 直到該節點為空或者為葉節點為止。例如 先訪問8,則將它的左右孩子互換,為 再將8的左右孩子...

演算法筆記十一 二叉樹之搜尋二叉樹

二叉樹 每個節點,除了key之外,還有3個屬性 父親 左孩子 右孩子,其中,父親一定大於左孩子,一定小於 等於 右孩子 搜尋二叉樹 利用二叉樹的這些性質,我們可以得出,在這樣乙個結構下,插入 刪除 查詢的步驟,最多不會超過樹的高度。注意哈,這裡的二叉樹,並不是平衡的,所以,其樹的高度並不等於lgn,...

陣列二叉樹

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