重建二叉樹

2021-10-22 07:53:37 字數 1607 閱讀 9514

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

例如,給出

前序遍歷 preorder = [3,9,20,15,7]

中序遍歷 inorder = [9,3,15,20,7]

返回如下的二叉樹:

3/ \

9  20

/  \

15   7

限制:0 <= 節點個數 <= 5000

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

treenode root = new treenode(preorder[0]);

for (int i=0; i遞迴,dfs

前序遍歷首位肯定是根節點值,在中序遍歷找到該根節點值位置(二叉樹無重複值是前提),則在位置左邊便是所有的左節點,右側有所有的右節點,且都是中序排序,並根據索引位置可知道左節點數;

根據左節點數,可找到左節點的前序遍歷,中序遍歷,將其放到方法中遞迴呼叫,則得到根節點的左節點,同理,可得到右節點;

注意邊界,前開後閉

code1在每次查詢根節點位置時,都需要遍歷對應的中序進行查詢,效率較低,優化。。。

/**

* definition for a binary tree node.

* public class treenode

* }*/class solution

for (int i=0; ipreright)

int rootval = preorder[preleft];

treenode node = new treenode(rootval);

int midindex = inorderindexmap.get(rootval);

node.left = this.buildtree(preorder, inorder, preleft+1, preleft+midindex-inleft, inleft, midindex-1);

node.right = this.buildtree(preorder, inorder, preleft+midindex-inleft+1, preright, midindex+1, inright);

return node;}}

相比code1,這裡我們先將中序遍歷的值及其位置索引放到map中,便於後面以o(1)的時間複雜度獲取根節點的問題,解決code1每次遍歷耗時的問題;

因為每次獲取的根節點索引都是相對於原始中序結果,所以需要遞迴中都是相對原始前序或中序結果的位置索引,不像code1中直接將對應的序列截出來遞迴,所以更需要計算好邊界問題,注意引數傳遞的都是閉區間;

二叉樹 重建二叉樹

問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...

二叉樹 重建二叉樹

題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...

二叉樹重建

摘自劉汝佳的 演算法競賽入門經典 preorder t t 的根結點 preorder t 的左子樹 preorder t 的右子樹 inorder t inorder t 的左子樹 t 的根結點 inorder t 的右子樹 postorder t postorder t 的左子樹 postord...