題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回
題目分析
本題主要考察了二叉樹的遍歷,先復習下
前序遍歷(VLR):
1.訪問根節點
2.前序遍歷左子樹
3.前序遍歷右子樹
中序遍歷(LVR):
1.中序遍歷左子樹
2.訪問根節點
3.中序遍歷右子樹
后序遍歷(LRV):
1.后序遍歷左子樹
2.后序遍歷右子樹
3.訪問根節點
總之,做這種有關樹、鏈表的題一定要有遞歸的思想,總之該題的解題思路就是四步,具體思路可以參考這里
1 確定根,確定左子樹,確定右子樹。
2 在左子樹中遞歸。
3 在右子樹中遞歸。
4 打印當前根。
代碼
/* function TreeNode(x) { this.val = x; this.left = null; this.right = null; } */ function reConstructBinaryTree(pre, vin) { // write code here if (pre.length === 0 || vin.length === 0) { return null; } // 前序第一個是根節點,也是中序左右子樹的分割點 const index = vin.indexOf(pre[0]), left = vin.slice(0, index), right = vin.slice(index + 1); return { val: pre[0], // 遞歸左右子樹的前序、中序 left: reConstructBinaryTree(pre.slice(1, index + 1), left), right: reConstructBinaryTree(pre.slice(index + 1), right) }; }