今天我們來學習如何將二叉樹轉為陣列(填坑學點演算法(九)——二叉樹中序遍歷演算法(遞迴實現))。
首先,我們看下面這棵二叉樹,我們從根節點出發,左右孩子依次排列在根節點後面,放入陣列中,然後繼續以同樣的方法遍歷其左右孩子,如果孩子節點的位置已經被叔父節點佔據,則繼續排在叔父節點後面,如果遇到沒有左右孩子的情況,則將沒有的節點置為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 ...