# 重建二叉树
# 题目
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
# 思路
- 利用前中后序遍历规则
- 前序遍历找到根结点root
- 找到root在中序遍历的位置 -> 左子树的长度和右子树的长度
- 截取左子树的中序遍历、右子树的中序遍历
- 截取左子树的前序遍历、右子树的前序遍历
- 递归重建二叉树
# 代码
const pre = [1,2,4,7,3,5,6,8]
const vin = [4,7,2,1,5,3,8,6]
function Node(key) {
this.key = key
this.left = null
this.right = null
}
function reMakeTree(pre, vin) {
if (!pre.length) return null
if (pre.length === 1) return new Node(pre[0])
const rootKey = pre[0]
const rootIndexVin = vin.indexOf(rootKey)
const vinLeft = vin.slice(0, rootIndexVin)
const vinRight = vin.slice(rootIndexVin + 1)
const preLeft = pre.slice(1, rootIndexVin + 1)
const preRight = pre.slice(rootIndexVin + 1)
const node = new Node(rootKey)
node.left = reMakeTree(preLeft, vinLeft)
node.right = reMakeTree(preRight, vinRight)
return node
}
console.log(reMakeTree(pre, vin))
# 题目2-求二叉树遍历
输入某二叉树的前序遍历和中序遍历的结果,输出后续遍历。
输入
ABC
BAC
FDXEAG
XDEFAG
输出
BCA
XEDGAF
# 代码
// const pre = ['A', 'B', 'C']
// const vin = ['B', 'A', 'C']
const pre = ['F','D','X','E','A','G']
const vin = ['X','D','E','F','A','G']
function Node(key) {
this.key = key
this.left = null
this.right = null
}
function getPost(pre, vin) {
if (!pre.length) return ''
if (pre.length === 1) return pre
const rootKey = pre[0]
const rootIndexVin = vin.indexOf(rootKey)
const vinLeft = vin.slice(0, rootIndexVin)
const vinRight = vin.slice(rootIndexVin + 1)
const preLeft = pre.slice(1, rootIndexVin + 1)
const preRight = pre.slice(rootIndexVin + 1)
const HRD = getPost(preLeft, vinLeft) + getPost(preRight, vinRight) + rootKey
return HRD
}
console.log(getPost(pre, vin))