根据前序中序,中序后序还原二叉树

628 阅读3分钟

这是我参与更文挑战的第10天,活动详情查看: 更文挑战 前面我们了解了二叉树的遍历,在面试中,面试题经常会出“给出前序中序还原二叉树或给出中序后序还原二叉树”的题目。那么如果我们遇到了怎么做呢?

根据前序中序还原二叉树

例如一个二叉树,它的前序遍历是ACFGBDE,中序遍历是FCGADBE,请你还原二叉树。
我们做这个题目,首先要先还原二叉树,还原二叉树要根据它前序和中序的特点。首先前序遍历的第一个节点就是根节点,我们能从中得到A就是根节点的信息。然后再看中序遍历,中序遍历根节点左边的是左子树,右边的右子树。那么我们能知道它的左子树是FCG,右子树是DBE.然后再看前序遍历,找左右子树的根节点。我们可以得到左子树的根节点是C,右子树的根节点是B. 最后看中序遍历,左子树左边的叶子节点是F,右边的叶子节点是G。右子树左边的叶子节点是D,右边的叶子节点是E。我们就能还原这个二叉树了。

批注 2021-06-10 233555.png

代码实现前序中序还原二叉树

var qian = ['a','c','f','g','b','d','e'];
var zhong = ['f','c','g','a','d','b','e'];

function Node(value) {
    this.value = value;
    this.left = null;
    this.right = null;
}

function f1(qian,zhong) {
   if (qian == null || zhong == null || qian.length == 0 || zhong.length == 0) return null;
   var root =new Node(qian[0]);//前序遍历第一位为根节点
   var index = zhong.indexOf(root.value);//找到根节点在中序遍历的位置
   var qianLeft = qian.slice(1,1 + index);//前序遍历的左子树
   var qianRight = qian.slice(1 + index,qian.length);//前序遍历的右子树
   var zhongLeft = zhong.slice(0,index);//中序遍历的左子树
   var zhongRight = zhong.slice(1 + index,zhong.length);//中序遍历的右子树
   root.left = f1(qianLeft,zhongLeft);//根据左子树的前序和中序还原左子树是并赋值给root.left
   root.right = f1(qianRight,zhongRight);//根据右子树的前序和中序还原右子树是并赋值给root.right
   return root;
}
var root = f1(qian,zhong);
console.log(root.left);
console.log(root.right);
console.log(root);

批注 2021-06-11 005114.png 这样子我们就用代码实现了根据前序中序还原二叉树。

根据中序后序还原二叉树

例如一个二叉树,它的中序遍历是FCGADBE,后序遍历是FGCDEBA,请你还原二叉树。
我们做这个题目,首先要先还原二叉树,还原二叉树要根据它后序和中序的特点。首先后序遍历的最后一个节点就是根节点,我们能从中得到A就是根节点的信息。然后再看中序遍历,中序遍历根节点左边的是左子树,右边的右子树。那么我们能知道它的左子树是FCG,右子树是DBE.然后再看后序遍历,找左右子树的根节点。我们可以得到左子树的根节点是C,右子树的根节点是B. 最后看中序遍历,左子树左边的叶子节点是F,右边的叶子节点是G。右子树左边的叶子节点是D,右边的叶子节点是E。我们就能还原这个二叉树了。

代码实现后序中序还原二叉树

var hou = ['f','g','c','d','e','b','a'];
var zhong = ['f','c','g','a','d','b','e'];

function Node(value) {
    this.value = value;
    this.left = null;
    this.right = null;
}

function f1(hou,zhong) {
   if (hou == null || zhong == null || hou.length == 0 || zhong.length == 0) return null;
   var root =new Node(hou[hou.length - 1]);//后序遍历最后一位为根节点
   var index = zhong.indexOf(root.value);//找到根节点在中序遍历的位置
   var houLeft = hou.slice(0,index);//后序遍历的左子树
   var houRight = hou.slice(index,hou.length - 1);//后序遍历的右子树
   var zhongLeft = zhong.slice(0,index);//中序遍历的左子树
   var zhongRight = zhong.slice(1 + index,zhong.length);//中序遍历的右子树
   root.left = f1(houLeft,zhongLeft);//根据左子树的后序和中序还原左子树是并赋值给root.left
   root.right = f1(houRight,zhongRight);//根据右子树的后序和中序还原右子树是并赋值给root.right
   return root;
}
var root = f1(hou,zhong);
console.log(root);
console.log(root.left);
console.log(root.right);

批注 2021-06-11 011224.png 这样子我们就用代码实现了根据后序中序还原二叉树。