一、 从中序与后序遍历序列构造二叉树
// 从中序与后序遍历序列构造二叉树
// 后序遍历的顺序是左右根 所以后序遍历的最后一个节点是根节点
// 中序遍历的顺序是左根右
// 找到根节点之后,根据中序遍历的顺序,把树分为左子树和右子树
// 递归循环遍历
var buildTree = function(inorder, postorder) {
// 用于找到根节点
let post_id;
// map返回一个新的数组,数组中的元素为原始数组调用函数处理后的值
const id_map = new Map();
const helper = (left,right) => {
// 如果这里没有节点构造二叉树了,就返回null
if (left >right) {
return null;
}
// 将post_id 位置的元素作为当前子树根节点
const root_val = postorder[post_id];
// 更新根节点的值
const root = new TreeNode(root_val);
// 根据 root 所在位置分成左右两棵子树
const index = id_map.get(root_val);
post_id--;
// 构造右子树
root.right = helper(index + 1,right);
// 构造左子树
root.left = helper(left, index - 1);
return root;
}
// 从后序遍历的最后一个元素开始
post_id = postorder.length - 1;
let idx = 0;
// forEach 对数组的每个元素执行一次内部的函数
inorder.forEach((val, idx) => {
id_map.set(val, idx);
});
return helper(0, inorder.length - 1);
};
二、最大二叉树
// 最大二叉树
var constructMaximumBinaryTree = function(nums) {
const construct = (nums,left,right)=>{
if(left>right) return null;
let best = left;
// 找到数组中最大的数作为根结点
for(let i = left+1; i <= right;i++){
if(nums[i] > nums[best]){
best = i;
}
}
// node更新新的根节点
const node = new TreeNode(nums[best]);
// 遍历左子树
node.left = construct(nums,left,best -1);
// 遍历右子树
node.right = construct(nums,best+1,right);
return node;
}
// 传入数组,数组最左边,最右边的值
return construct(nums,0,nums.length-1);
};
三、合并二叉树
// 合并二叉树
var mergeTrees = function(root1, root2) {
if(root1 === null) return root2;
if(root2 === null) return root1;
//如果两棵树此结点都存在,将两个结点的值相加
let newTree = new TreeNode(root1.val + root2.val);
//先从左边开始搜索
newTree.left = mergeTrees(root1.left, root2.left);
newTree.right = mergeTrees(root1.right, root2.right);
return newTree;
};