輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
3/ \
9 20
/ \
15 7
限制:0 <= 節點個數 <= 5000
code1在每次查詢根節點位置時,都需要遍歷對應的中序進行查詢,效率較低,優化。。。/**
* definition for a binary tree node.
* public class treenode
* }*/class solution
treenode root = new treenode(preorder[0]);
for (int i=0; i遞迴,dfs
前序遍歷首位肯定是根節點值,在中序遍歷找到該根節點值位置(二叉樹無重複值是前提),則在位置左邊便是所有的左節點,右側有所有的右節點,且都是中序排序,並根據索引位置可知道左節點數;
根據左節點數,可找到左節點的前序遍歷,中序遍歷,將其放到方法中遞迴呼叫,則得到根節點的左節點,同理,可得到右節點;
注意邊界,前開後閉
/**
* 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...