輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}
和中序遍歷序列{4,7,2,1,5,3,8,6}
,則重建二叉樹並返回。javascript
首先前序/後序遍歷 + 中序遍歷能夠重建二叉樹。題目考察的就是前序+中序來重建二叉樹,後序+中序的思路是相似的。前端
假設有二叉樹以下:java
1 / \ 2 3 / \ 4 5
它的前序遍歷的順序是:1 2 4 5 3
。中序遍歷的順序是:4 2 5 1 3
node
由於前序遍歷的第一個元素就是當前二叉樹的根節點。那麼,這個值就能夠將中序遍歷分紅 2 個部分。在以上面的例子,中序遍歷就被分紅了 4 2 5
和 3
兩個部分。4 2 5
就是左子樹,3
就是右子樹。git
最後,根據左右子樹,繼續遞歸便可。github
專一前端與算法的系列乾貨分享,歡迎關注(¬‿¬):
「微信公衆號: 心譚博客」| xxoo521.com | GitHub
// ac地址:https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6 // 原文地址:https://xxoo521.com/2019-12-21-re-construct-btree/ /* function TreeNode(x) { this.val = x; this.left = null; this.right = null; } */ /** * @param {TreeNode} pre * @param {TreeNode} vin * @return {TreeNode} */ function reConstructBinaryTree(pre, vin) { if (!pre.length || !vin.length) { return null; } const rootVal = pre[0]; const node = new TreeNode(rootVal); let i = 0; // i有兩個含義,一個是根節點在中序遍歷結果中的下標,另外一個是當前左子樹的節點個數 for (; i < vin.length; ++i) { if (vin[i] === rootVal) { break; } } node.left = reConstructBinaryTree(pre.slice(1, i + 1), vin.slice(0, i)); node.right = reConstructBinaryTree(pre.slice(i + 1), vin.slice(i + 1)); return node; }
專一前端與算法的系列乾貨分享,歡迎關注(¬‿¬)算法