根據二叉樹的前序遍歷{1,2,4,7,3,5,6,8}和中序遍歷{4,7,2,1,5,3,8,6},從新構建二叉樹。ui
遍歷順序:spa
因此有了前序遍歷和中序遍歷必定能夠肯定惟一的二叉樹,前序遍歷的pre[0]就是根節點的位置,因此先在中序遍歷中找到根節點的位置,而後根節點的左邊就是中序遍歷的左子樹,右邊就是中序遍歷的右子樹,左子樹和右子樹一樣也是中序遍歷,使用遞歸獲得最終結果。code
function reConstructBinaryTree(pre, vin) {
if (!pre || pre.length === 0) {
return;
}
var treeNode = {
root: pre[0]
}
for(var i = 0; i < pre.length; i++) {
if (vin[i] === pre[0]) {
// left遞歸體中的兩個參數,是前序變量的左子樹和終須變量的左子樹
treeNode.left = reConstructBinaryTree(pre.slice(1, i+1), vin.slice(0, i));
// right遞歸體中的兩個參數,是前序變量的右子樹和終須變量的右子樹
// 由於第i個是根節點,須要跳過
treeNode.right = reConstructBinaryTree(pre.slice(i+1),vin.slice(i+1));
}
}
return treeNode;
console.log(treeNode)
}
複製代碼
若是給定中序遍歷和後序遍歷,一樣能夠重建二叉樹,只不過由前序遍歷的第一項是根節點變成了後序遍歷的最後一項是根節點。一樣找到中序遍歷中根節點的位置,而後進行遞歸。遞歸
function reConstructBinaryTree(vin, pos) {
if (!pos || pos.length === 0) {
return;
}
var treeNode = {
root: pos[pos.length-1]
}
for(var i = 0; i < pos.length; i++) {
if (vin[i] === pos[pos.length-1]) {
// left遞歸體中的兩個參數,是前序變量的左子樹和終須變量的左子樹
treeNode.left = reConstructBinaryTree(pre.slice(1, i+1), vin.slice(0, i));
// right遞歸體中的兩個參數,是前序變量的右子樹和終須變量的右子樹
// 由於第i個是根節點,須要跳過
treeNode.right = reConstructBinaryTree(pre.slice(i+1),vin.slice(i+1));
}
}
return treeNode;
console.log(treeNode)
}
複製代碼