根据前序、中序还原二叉树
简介
给定二叉树的前序遍历和中序遍历序列,可以还原出原始的二叉树。前序遍历是先访问根节点,然后遍历左子树,最后遍历右子树。中序遍历是先遍历左子树,然后访问根节点,最后遍历右子树。
二叉树
示例
前序遍历序列:['a', 'b', 'd', 'e', 'c', 'f', 'g']
中序遍历序列:['d', 'b', 'e', 'a', 'f', 'c', 'g']
实现方法
class Node {
constructor(value) {
this.value = value
this.left = null
this.right = null
}
}
function fun(qian, zhong) {
// 严谨性判断
if (
qian == null ||
zhong == null ||
qian.length == 0 ||
zhong.length == 0 ||
qian.length != zhong.length
)
return
// 根节点 -- 前序的第一个元素
let root = new Node(qian[0]) // 创建根节点,值为前序遍历的第一个元素
let index = zhong.indexOf(root.value) // 在中序遍历序列中找到根节点的索引
let qianLeft = qian.slice(1, index + 1) // 前序遍历序列的左子树部分
let qianRight = qian.slice(index + 1) // 前序遍历序列的右子树部分
let zhongLeft = zhong.slice(0, index) // 中序遍历序列的左子树部分
let zhongRight = zhong.slice(index + 1) // 中序遍历序列的右子树部分
root.left = fun(qianLeft, zhongLeft) // 递归构建左子树
root.right = fun(qianRight, zhongRight) // 递归构建右子树
return root // 返回构建好的根节点
}
const root = fun(qian, zhong)
console.log(root)