只要在中序遍歷中定位到根節點,就可以得到左子樹和右子樹的中序、前序遍歷結果。遞迴地構造出左右子樹,再將這兩顆子樹接到根節點的左右位置。
使用雜湊表快速定位中序遍歷中的根節點:鍵表示節點的值,值表示該節點在中序遍歷結果中的位置。構造二叉樹前先遍歷一遍中序遍歷結果構造出該雜湊對映,之後定位根節點就只需要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...