已知二叉树的前序遍历、中序遍历,求后序遍历
http://blog.csdn.net/xyz5354/article/details/39140489
二叉树的遍历
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
求下面树的三种遍历:
前序遍历:abdefgc
中序遍历:debgfac
后序遍历:edgfbca
已知前序、中序遍历,重构二叉树
前序遍历的第一个值就是根节点,然后再中序遍历中找到这个值,那么这个值的左边部分即为当前二叉树的左子树部分前序遍历结果,这个值的右边部分即为当前二叉树的右子树部分前序遍历结果。
如上图:前序a为根节点,再看中序里面的a,由于中序是(左根右),所以a的左边debgf为左子树,右边c为右子树
代码如下:
/** * Created by wuchao on 17-3-28. */ public class Class01 { public static void main(String[] args){ int[] pre = {1,2,4,7,3,5,6,8}; int[] in = {4,7,2,1,5,3,8,6}; TreeNode tree = reConstructBinaryTree(pre,in); System.out.println(preSort(tree)); System.out.println(inSort(tree)); } //根据前序和中序排列构造二叉树 public static TreeNode reConstructBinaryTree(int [] pre,int [] in) { int root = pre[0];//pre的第一个元素肯定是这两个数组的根根节点 //下面将pre的所有元素前移,目的是每次执行该函数,都可以依次获取pre的元素,而不需要添加索引 for(int i=0;i<pre.length-1;i++){ pre[i]=pre[i+1]; } if(in.length==1){ return new TreeNode(root); } //System.out.println(root); int index=-1;//表示根节点在in中的位置,in数组中,根节点左侧是左子树,右侧是右子树 //下面查找根节点在in的位置 for(int i=0;i<in.length;i++){ if(root == in[i]){ index =i; break; } } TreeNode tree = new TreeNode(root); if(index>0){ int[] inTmp = new int[index]; for(int i=0;i<index;i++){ inTmp[i]=in[i]; } tree.left=reConstructBinaryTree(pre,inTmp); } if(index<in.length-1){ int[] inTmp = new int[in.length-1-index]; for(int i=index+1;i<in.length;i++){ inTmp[i-index-1]=in[i]; } tree.right=reConstructBinaryTree(pre,inTmp); } return tree; } //前序排列 public static String preSort(TreeNode tree){ if(tree ==null) return ""; String res=""; res=res+tree.val; if(tree.left!=null){ res = res+preSort(tree.left); } if(tree.right!=null){ res = res+preSort(tree.right); } return res; } //中序排列 public static String inSort(TreeNode tree){ if(tree ==null) return ""; String res=""; if(tree.left!=null){ res=res+inSort(tree.left); } res=res+tree.val; if(tree.right!=null){ res=res+inSort(tree.right); } return res; } //后序排列 public static String postSort(TreeNode tree){ if(tree ==null) return ""; String res=""; if(tree.left!=null){ res = res+preSort(tree.left); } if(tree.right!=null){ res = res+preSort(tree.right); } res=res+tree.val; return res; } //打印数组 public static void printArray(int[] array){ String s="["; for(int i=0;i<array.length;i++){ s=s+" "+array[i]; } s=s+"]"; System.out.println(s); } static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } }
已知前序、中序遍历,求后序遍历
前序遍历的第一个值就是根节点,然后再中序遍历中找到这个值,那么这个值的左边部分即为当前二叉树的左子树部分前序遍历结果,这个值的右边部分即为当前二叉树的右子树部分前序遍历结果。
如上图:前序a为根节点,再看中序里面的a,由于中序是(左根右),所以a的左边debgf为左子树,右边c为右子树
所以递归调用左子树:左子树的前序遍历中序遍历为:bdefg、debgf
再递归调用右子树:c、c
递归的过程:
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
已知中序、后序,求前序遍历
后序遍历最后一个结点即为根结点
递归的过程:
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
联系方式:wuchaodzxx@126.com