题目: 已知一颗二叉树的前序遍历,中序遍历,求出后续排遍历
解题思路,根据前序、中序遍历,构建出源二叉树,再进行后续遍历,求出后序遍历,可以理解为leedcode中的 106. 从中序与后序遍历序列构造二叉树 变种题,其实就是多了个后序遍历过程,具体的构建二叉树的思想就是,根据每种遍历的特点,得出相应节点的位置,其中,前序遍历特点是,中左右、中序遍历是,左中右、后序遍历是,左右中;那么就可以根据前序遍历或者后序遍历,得出父节点(shift或者pop出父节点),然后根据中序遍历分割左右子树,然后根据分割出的子树再次重复分割,直到得到对应的叶子节点,整个二叉树就重构出来了,最后进行一次后序遍历得出结果即可
上代码:
function getOld(preStr, midStr) {
function getPostorderTraversal(preStr, midStr) {
// 构建二叉树函数
if (midStr.length === 0) return null
let rootVal = preStr.shift()
let rootNode = new Tree(rootVal)
let rootIndex = midStr.indexOf(rootVal)
// 递归
rootNode.left = getPostorderTraversal(preStr.slice(0, rootIndex), midStr.slice(0, rootIndex))
rootNode.right = getPostorderTraversal(preStr.slice(rootIndex), midStr.slice(rootIndex + 1))
return rootNode
// 二叉树函数
function Tree(val, left, right) {
this.val = (val === undefined) ? null : val
this.left = (left === undefined) ? null : left
this.right = (right === undefined) ? null : right
}
}
let curr = getPostorderTraversal(preStr, midStr)
// 后序遍历得出结果
function PostorderTraversal(node, result) {
if (node === null) return
PostorderTraversal(node.left, result)
PostorderTraversal(node.right, result)
result.push(node.val)
return result
}
return PostorderTraversal(curr, [])
}
我只能说脑子不清醒,这种简单题都没做出来.........