这是我参与更文挑战的第10天,活动详情查看: 更文挑战 前面我们了解了二叉树的遍历,在面试中,面试题经常会出“给出前序中序还原二叉树或给出中序后序还原二叉树”的题目。那么如果我们遇到了怎么做呢?
根据前序中序还原二叉树
例如一个二叉树,它的前序遍历是ACFGBDE,中序遍历是FCGADBE,请你还原二叉树。
我们做这个题目,首先要先还原二叉树,还原二叉树要根据它前序和中序的特点。首先前序遍历的第一个节点就是根节点,我们能从中得到A就是根节点的信息。然后再看中序遍历,中序遍历根节点左边的是左子树,右边的右子树。那么我们能知道它的左子树是FCG,右子树是DBE.然后再看前序遍历,找左右子树的根节点。我们可以得到左子树的根节点是C,右子树的根节点是B.
最后看中序遍历,左子树左边的叶子节点是F,右边的叶子节点是G。右子树左边的叶子节点是D,右边的叶子节点是E。我们就能还原这个二叉树了。
代码实现前序中序还原二叉树
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);
这样子我们就用代码实现了根据前序中序还原二叉树。
根据中序后序还原二叉树
例如一个二叉树,它的中序遍历是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);
这样子我们就用代码实现了根据后序中序还原二叉树。