zoukankan      html  css  js  c++  java
  • 已知二叉树的前序遍历、中序遍历,求后序遍历

    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 打印当前根。

  • 相关阅读:
    ipad与windows互传文件(不需要安装app)
    为WordPress所有的Tags标签添加Nofollow
    为什么应该用网站来替代电商平台是开网店?
    实体转JSON时,值为null的字段丢失问题
    finally 与 return
    URI, URL, and URN
    HTTP
    EasyPoi 一对多数据导入 null值问题
    热点探测
    elasticsearch数据操作02
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/6638526.html
Copyright © 2011-2022 走看看