根據前序和中序遍歷序列來構建二叉樹

2021-10-06 09:48:44 字數 2626 閱讀 5402

給定乙個二叉樹,我們可以寫出前序遍歷與中序遍歷的序列,那麼我們給定前序和中序遍歷的序列,我們怎樣才能將這顆二叉樹還原呢???

給定前序遍歷的陣列序列為: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 前邊的序列為根的...