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

  • 相关阅读:
    POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)
    UVaLive 5031 Graph and Queries (Treap)
    Uva 11996 Jewel Magic (Splay)
    HYSBZ
    POJ 3580 SuperMemo (Splay 区间更新、翻转、循环右移,插入,删除,查询)
    HDU 1890 Robotic Sort (Splay 区间翻转)
    【转】ACM中java的使用
    HDU 4267 A Simple Problem with Integers (树状数组)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4417 Super Mario (树状数组/线段树)
  • 原文地址:https://www.cnblogs.com/wuchaodzxx/p/6638526.html
Copyright © 2011-2022 走看看