給定乙個二叉樹,我們可以寫出前序遍歷與中序遍歷的序列,那麼我們給定前序和中序遍歷的序列,我們怎樣才能將這顆二叉樹還原呢???
給定前序遍歷的陣列序列為:int preorder,中序遍歷序列陣列為:int inorder
為了快速定位到中序遍歷元素的下標,我們可以構建乙個hash表來儲存該元素與對應的下標。(此方法只適用於二叉樹的元素的值沒有相同的。)
我們用preorder_left,preorder_right表示前序遍歷的陣列的第乙個下標和最後乙個下標,用inorder_left,inorder_right表示中序遍歷陣列的第乙個和最後乙個下標。
每個root節點的左或右子樹都是一顆二叉樹,所以我們可以使用遞迴的方式來構建。
詳細的**如下:
public
class
constructbinary
;//前序遍歷序列
int[
] inorder =
;//中序遍歷序列
treenode node = cb.
buildtree
(preorder, inorder)
; cb.
printtree
(node);}
/** *
* @param preorder 前序遍歷的陣列序列
* @param inorder 中序遍歷的陣列序列
* @return root節點
*/public treenode buildtree
(int
preorder,
int[
] inorder)
return
mybuildtree
(preorder, inorder,
0, n -1,
0, n -1)
;}/** *
* @param preorder 前序遍歷的陣列序列
* @param inorder 中序遍歷的陣列序列
* @param preorder_left 前序遍歷陣列左邊界
* @param preorder_right 前序遍歷陣列右邊界
* @param inorder_left 中序遍歷陣列左邊界
* @param inorder_right 中序遍歷陣列右邊界
* @return 根節點
*/private treenode mybuildtree
(int
preorder,
int[
] inorder,
int preorder_left,
int preorder_right,
int inorder_left,
int inorder_right)
//前序遍歷的第乙個節點為根節點
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;
//遞迴構建左子樹,並連線到根節點
root.left =
mybuildtree
(preorder, inorder, preorder_left +
1, preorder_left + size_left_subtree, inorder_left, inorder_root -1)
;//構建右子樹,並連線到根節點
root.right =
mybuildtree
(preorder, inorder, preorder_left + size_left_subtree +
1, preorder_right, inorder_root +
1, inorder_right)
;return root;
}//寫個前序遍歷二叉樹的方法
public
void
printtree
(treenode node)
//向右遞迴
if(node.right != null)}}
}class
treenode
}
如何根據前序遍歷序列和中序遍歷序列確定二叉樹
分段,每一段找根節點,就好,找root,有點遞迴的思路。例如 假設某二叉樹的先序遍歷序列是abdgcefh,中序遍歷序列是dgbaechf,畫出二叉樹,並給出其後序遍歷序列.以下面的例題為例進行講 已知一棵二叉樹的先序遍歷序列和中序遍歷序列分別是abdgcefh dgbaechf,求二叉樹及後序遍歷...
根據前序遍歷序列和中序遍歷序列重建二叉樹
題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。程式設計思路 1.先求出根節點 前序序列第乙個元素 2.將根節點帶入到中序遍歷序列中求出左右子樹的中序遍歷序列。3.通過左...
根據前序遍歷序列和中序遍歷序列構造二叉樹演算法
乙個前序遍歷序列和乙個中序遍歷序列可以確定一顆唯一的二叉樹。根據前序遍歷的特點,知前序序列 presequence 的首個元素 presequence 0 為二叉樹的根 root 然後在中序序列 insequence 中查詢此根 root 根據中序遍歷特點,知在查詢到的根 root 前邊的序列為根的...