//输入先序遍历、中序遍历求后续遍历
const input1 = "FDXEAG";//
const input2 = "XDEFAG";
const dlr = input1.split('');
const ldr = input2.split('');
//遍历序列生成二叉树
function createNode(dlr, ldr){
if( dlr.length === 0){
//先序序列长度为0,说明整个树已经遍历完成
return null;
}
if(ldr.length === 0){
//中序序列长度为0,说明该节点上一级已是叶子节点
return null;
}
//从先序序列获取一个节点的值
const val = dlr.shift();
//从中序序列中找到该节点的左右子树中序序列
const index = ldr.indexOf(val);
const left = ldr.slice(0, index);
const right = ldr.slice(index + 1);
//递归生成节点
function Node() {
this.val = val;
this.left = createNode(dlr,left);
this.right = createNode(dlr, right)
}
const node = new Node();
return node;
}
//后续遍历,按照根右左的顺序遍历,反转后即为后序序列
function LRD(node, arr) {
arr.push(node.val);
if(node.right){
LRD(node.right, arr);
}
if(node.left){
LRD(node.left,arr)
}
}
//生成二叉树,得到根节点
const tree = createNode(dlr, ldr);
//得到后序遍历序列
const lrd = []
LRD(tree, lrd);
//输出结果
console.log(lrd.reverse().join(''))
console