二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树
Posted 小写丶H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树相关的知识,希望对你有一定的参考价值。
根据前中后序历数组构建二叉树
一.根据一棵树的前序遍历与中序遍历构造二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
思路
首先我们可以知道通过前序遍历和中序遍历,就可以知道整个二叉树的结构了。然后自上而下的深度递归构造。
代码
private int index=0;
public TreeNode buildTree(int[] preorder, int[] inorder)
index=0;
return buildTreeHelper(preorder,inorder,0,inorder.length);
private TreeNode buildTreeHelper(int[] preorder, int[] inorder, int left, int right)
//空树
if(left>=right)
return null;
//遍历完
if(index>=preorder.length)
return null;
//根据当前根节点的值创建出根节点
TreeNode root=new TreeNode(preorder[index]);
index++;
//中序遍历数组中找到root的位置
int pos=find(inorder,left,right,root.val);
//左子树是root在中序遍历结果中的左边的节点
root.left=buildTreeHelper(preorder,inorder,left,pos);
//同理,右子树是root在中序遍历结果中的右边的节点,记得要pos+1
root.right=buildTreeHelper(preorder,inorder,pos+1,right);
return root;
//查找出root在中序遍历数组中的位置
private int find(int[] inorder, int left, int right, int toFind)
//遍历查找
for (int i = left; i < right; i++)
if(inorder[i]==toFind)
return i;
//没找到按理不存在(一定能找到)
return -1;
二.根据一棵树的中序遍历与后序遍历构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:你可以假设树中没有重复的元素。
思路
首先一定要先看懂我上面的前序遍历和中序遍历构造二叉树(这个理解之后,那么这题就很简单了),看图
所以我们只需要逆置一下二叉树的后序遍历,那么就得到前序遍历的镜像了,根右左。所以就转换成了前序遍历和中序遍历二叉树的问题了。构造左右的时候只需要注意,先构造右,,再构造左即可,其余代码一模一样。
代码
private int index=0;
public TreeNode buildTree(int[] inorder, int[] postorder)
index=0;
//逆置后序遍历数组
reverse(postorder);
return buildTreeHelper(postorder,inorder,0,inorder.length);
//因为后序遍历,逆置一下,就是先序遍历的镜像,根右左
//这样就转化成 先序与中序遍历构造二叉树的问题了(只是要注意左右子树顺序)
private void reverse(int[] postorder)
int left=0;
int right=postorder.length-1;
//交换
while (left<right)
int tmp=postorder[left];
postorder[left]=postorder[right];
postorder[right]=tmp;
left++;
right--;
private TreeNode buildTreeHelper(int[] postorder, int[] inorder, int left, int right)
//空树
if(left>=right)
return null;
//遍历完
if(index>=postorder.length)
return null;
//根据当前根节点的值创建出根节点
TreeNode root=new TreeNode(postorder[index]);
index++;
int pos=find(inorder,left,right,root.val);
//代码和前序遍历与中序遍历构造二叉树一样
//只是需要注意改动一下左右构造的顺序即可
//代码不做详细注解了,不懂的可以看前序和中序构造二叉树的代码注释(基本一模一样)
root.right=buildTreeHelper(postorder,inorder,pos+1,right);
root.left=buildTreeHelper(postorder,inorder,left,pos);
return root;
private int find(int[] inorder, int left, int right, int toFind)
for (int i = left; i < right; i++)
if(inorder[i]==toFind)
return i;
return -1;
有人可能会问,为啥没有前序遍历和后序遍历构造二叉树的题呢?
嘿嘿嘿,首先通过遍历构造二叉树,一定要知道两种遍历结果,并且中序遍历一定要存在,不然无法确定二叉树的结果哦。
以上是关于二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树的主要内容,如果未能解决你的问题,请参考以下文章
输入后序和中序,构造二叉树,并输出该二叉树的层序前序中序后序遍历结构;输入后序和中序,构造二叉树,并输出该二叉树的层序前序中序后序遍历结构