/*
View the full problem and run the test cases at:
https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {number[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
var buildTree = function(preorder, inorder) {
};
*/
class TreeNode {
constructor(val) {
this.val = val;
this.left = null;
this.right = null;
}
}
let a = new TreeNode("a");
let b = new TreeNode("b");
let c = new TreeNode("c");
let d = new TreeNode("d");
let e = new TreeNode("e");
let f = new TreeNode("f");
let g = new TreeNode("g");
let h = new TreeNode("h");
let i = new TreeNode("i");
let j = new TreeNode("j");
let k = new TreeNode("k");
let l = new TreeNode("l");
let m = new TreeNode("m");
a.left = b;
a.right = c;
b.left = d;
b.right = e;
c.left = f;
c.right = g;
h.left = i;
h.right = k;
i.right = j;
k.left = l;
l.right = m;
//--------------------------------------\\
console.log( a );
console.log(h)
console.log('a.val: ', a.val);
console.log('b.val: ', b.val);
console.log('a.left: ', a.left);
console.log( 'a.right: ', a.right );
console.log("h.left: ", h.left);
//--------------------------------------------------------------------------------------\\
console.log(
"//--------------------------------------------------------------------------------------\\"
);
const preO = [3, 9, 20, 15, 7];
const inO = [9, 3, 15, 20, 7];
function buildTree(preorder, inorder) {
if (!preorder.length && !inorder.length) return null;
// the first element in the preorder array is the root
let root = new TreeNode(preorder[0]);
let rootIdx = inorder.indexOf(preorder[0]);
// the left subtree is everything in the inorder array to the left of the root
let leftInorder = inorder.slice(0, rootIdx);
// the right subtree is everything in the inorder array to the right of the root
let rightInorder = inorder.slice(rootIdx + 1);
// to build the left subtree, the values in the leftPreorder array have to be the same as the ones in the leftInorder array
let leftPreorder = preorder.filter((val) => leftInorder.includes(val));
// to build the left subtree, the values in the leftPreorder array have to be the same as the ones in the leftInorder array
let rightPreorder = preorder.filter((val) => rightInorder.includes(val));
root.left = buildTree(leftPreorder, leftInorder);
root.right = buildTree(rightPreorder, rightInorder);
return root;
}
console.log(
"//--------------------------------------------------------------------------------------\\"
);
buildTree( preO, inO );
console.log('buildTree( preO, inO ): ', buildTree( preO, inO ));
//--------------------------results below--------------------------------------------
/*
node 105-Construct\ Binary\ Tree\ from\ Preorder\ and\ Inorder\ Traversal.js
TreeNode {
val: 'a',
left: TreeNode {
val: 'b',
left: TreeNode { val: 'd', left: null, right: null },
right: TreeNode { val: 'e', left: null, right: null }
},
right: TreeNode {
val: 'c',
left: TreeNode { val: 'f', left: null, right: null },
right: TreeNode { val: 'g', left: null, right: null }
}
}
TreeNode {
val: 'h',
left: TreeNode {
val: 'i',
left: null,
right: TreeNode { val: 'j', left: null, right: null }
},
right: TreeNode {
val: 'k',
left: TreeNode { val: 'l', left: null, right: [TreeNode] },
right: null
}
}
a.val: a
b.val: b
a.left: TreeNode {
val: 'b',
left: TreeNode { val: 'd', left: null, right: null },
right: TreeNode { val: 'e', left: null, right: null }
}
a.right: TreeNode {
val: 'c',
left: TreeNode { val: 'f', left: null, right: null },
right: TreeNode { val: 'g', left: null, right: null }
}
h.left: TreeNode {
val: 'i',
left: null,
right: TreeNode { val: 'j', left: null, right: null }
}
//--------------------------------------------------------------------------------------\
//--------------------------------------------------------------------------------------\
buildTree( preO, inO ): TreeNode {
val: 3,
left: TreeNode { val: 9, left: null, right: null },
right: TreeNode {
val: 20,
left: TreeNode { val: 15, left: null, right: null },
right: TreeNode { val: 7, left: null, right: null }
}
}
\___________________________________________________
bryan_dir:105-construct-b-tree_exitstatus:0 ====>
<--------------------------------------------------->
/*************************************
* PREORDER = [3,9,20,15,7] *
* INORDER = [9,3,15,20,7] *
* RETURN THE FOLLOWING BINARY TREE: *
* 3 *
* / \ *
* 9 20 *
* / \ *
* 15 7 *
*************************************/