JZ 07 重建二叉樹(樹 遞迴)

2021-10-20 19:54:09 字數 2893 閱讀 3064

只要在中序遍歷中定位到根節點,就可以得到左子樹和右子樹的中序、前序遍歷結果。遞迴地構造出左右子樹,再將這兩顆子樹接到根節點的左右位置。

使用雜湊表快速定位中序遍歷中的根節點:鍵表示節點的值,值表示該節點在中序遍歷結果中的位置。構造二叉樹前先遍歷一遍中序遍歷結果構造出該雜湊對映,之後定位根節點就只需要o(1)的時間了。

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

//前序遍歷中的第乙個節點就是根節點

int preorder_root = preorder_left;

//在中序遍歷中定位根節點

int inorder_root = indexmap.

get(preorder[preorder_root]);

//建立二叉樹的根節點

treenode root =

newtreenode

(preorder[preorder_root]);

//獲取左子樹中的節點數

int size_left_subtree = inorder_root - inorder_left;

/* 遞迴地構造左子樹,並連線到根節點

前序遍歷中 從左邊界+1開始的size_left_subtree 個元素對應了

中序遍歷中 從左邊界開始到根節點定位-1 的元素

*/root.left =

mybuildtree

(preorder, inorder, preorder_left +

1, preorder_left + size_left_subtree, inorder_left, inorder_root -1)

;/* 遞迴地構造右子樹,並連線到根節點

前序遍歷中 從 左邊界+1+左子樹節點數 開始 到 右邊界的元素對應了

中序遍歷中 從 根節點定位+1 到 右邊界的元素

*/root.right =

mybuildtree

(preorder, inorder, preorder_left + size_left_subtree +

1, preorder_right, inorder_root +

1, inorder_right)

;return root;

}public treenode buildtree

(int

preorder,

int[

] inorder)

return

mybuildtree

(preorder, inorder,

0, n -1,

0, n -1);}}

notes:

map介面中 object get(object k)返回指定鍵所指的值,若此對映不包含該鍵的對映關係,返回null;object put(object k, object v)將指定的值與此對映中的指定鍵關聯。

hashmap雜湊表實現了map介面。

對於前序遍歷中的任意兩個連續節點 u 和 v ,只有兩種可能的關係:

v 是 u 的左孩子

u 沒有左孩子,則 v 為 u 的某個祖先節點(或 u 本身)的右孩子。如果 u 沒有右孩子,就向上回溯,設遇到的第乙個有右孩子的節點為ua,則 v 就是ua的右孩子。

用乙個棧來維護【當前節點的所有還沒有考慮過右孩子的祖先節點】,棧頂為當前節點,即,只有在棧內的節點才有可能連線乙個新的右孩子。

用乙個==指標 index ==指向中序遍歷中的某個位置,對應【當前節點不斷往左走會到達的最終節點】,初始值為0。

舉例:

歸納出演算法流程:

用乙個棧和乙個指標輔助二叉樹的構造,初始時棧中存入根節點(前序遍歷的第乙個節點),指標指向中序遍歷的第乙個節點;

從前序遍歷結果中的第二個節點開始遍歷。

若 index 恰好指向棧頂節點,不斷彈出棧頂節點並右移 index ,並將當前節點作為最後彈出的節點的右孩子入棧;

否則將當前節點作為棧頂節點的左孩子入棧。

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

treenode root =

newtreenode

(preorder[0]

);//建立根節點

deque

stack =

newlinkedlist

(); stack.

push

(root)

;//根節點入棧

int inorderindex =0;

//從前序遍歷結果中的第二個節點開始遍歷

for(

int i =

1; i < preorder.length; i++

)else

node.right =

newtreenode

(preorderval)

;//將當前節點作為最後彈出的節點的右孩子

stack.

push

(node.right)

;//當前節點入棧}}

return root;

}}

notes:

參考1參考2

07 重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。示例 前序遍歷 preorder 3 9,20 15,7 中序遍歷 inorder 9 3,15 20,7 返回如下的二叉樹 3 920 157 definition for a ...

07 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 限制 0 節點個數 5000 解 ...

07 重建二叉樹

利用python陣列的index函式來定位根節點在inorder陣列中的位置 index inorder.index root.val preorder陣列不需要進行切片操作,遞迴終止條件主要靠 前兩行中的not inorder來終止。root.left self.buildtree preorde...