1、首先是利用构造函数创建一个二叉树的的数据结构
(注意:在js中没有{1,2,3}这样的变量,故使用数组)
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
2、先分析,二叉树先序遍历,即第一个元素为根节点,在中序遍历中,根节点之前的所有元素为左子树(长度为llen),之后的所有元素为右子树(r长度为len),现在,再回到先序遍历,根节点之后llen长度的元素顺序为左子树的先序遍历顺序,右子树同理,故而可使用递归来构建。
3、注意:数组的slice方法“取前不取后”
完整代码如下:
//由先序遍历和中序遍历构造二叉树
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
var pre = [1, 2, 4, 7, 3, 5, 6, 8],
vin = [4, 7, 2, 1, 5, 3, 8, 6];
function reConstructBinaryTree(pre, vin) {
var T = new TreeNode();
function createTree(T, pre, vin) {
if (pre.length === 0) {
T.val = null;
return;
}
var rootnode = pre[0];
var index = vin.indexOf(rootnode);
var lchildvinarr = vin.slice(0, index),
rchildvinarr = vin.slice(index + 1),
lchildvinlen = lchildvinarr.length,
rchildvinlen = rchildvinarr.length;
var lchildprearr = pre.slice(1, lchildvinlen + 1),
rchildprearr = pre.slice(lchildvinlen + 1);
T.val = rootnode;
T.left = new TreeNode();
T.right = new TreeNode();
if (T.val) {
createTree(T.left, lchildprearr, lchildvinarr);
createTree(T.right, rchildprearr, rchildvinarr);
}
}
createTree(T, pre, vin);
return T;
}
var T = reConstructBinaryTree(pre,vin);