二叉树的前序中序后序遍历(2)

参考Macho0723的博客,网址:https://blog.csdn.net/qq_34154570/article/details/82700094

已知前序、中序,求二叉树和后序遍历结果

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。(剑指offer原题)

        1                          1                         1                               1                                      1 

472    5386              2     5386        2           5386                2         3                  2                    3

                            47                   4                                   4          5     86         4                  5             6

                                                         7                                  7                             7                          8

具体代码为:

 

方法:

Arrays.copyOfRange(T[ ] original,int from,int to) //将一个原始的数组original,从下标from开始复制,复制到上标to,生成一个新的数组。即复制范围为:[from,to)

 

 

package algorithm;

import java.util.Arrays;

/*
 参考Macho0723的博客,网址:https://blog.csdn.net/qq_34154570/article/details/82700094

已知前序、中序,求二叉树和后序遍历结果

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。(剑指offer原题)

     1                        1                1                            1                             1 

472    5386              2     5386        2        5386                2         3                  2          3

                       47               4                             4          5     86         4          5       6

                                          7                             7                             7             8

具体代码为:
 * */

public class Tree {


    class TreeNode{
        int value;
        TreeNode left;
        TreeNode right;
        TreeNode(int value1){
            this.value=value1;
        }
        
    }
    
    public static TreeNode createTree(int[] pre,int[] mid){
        if(pre==null||mid==null||pre.length==0||mid.length==0){
            return null;
        }
        
        TreeNode node=new Tree().new TreeNode(pre[0]);
        for(int i=0;i<mid.length;i++){
            if(pre[0]==mid[i]){//相同
              // node.left=
               //其中方法Arrays.copyOfRange(T[ ] original,int from,int to) 
                //原始数组original,从from(包括)开始复制,复制到上标to(不包括),生成一个新的数组。即复制范围为:[from,to)
               node.left = createTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(mid, 0, i));
               node.right = createTree(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(mid, i + 1, mid.length));

            }
        }
        
        
        return node;
        
    }
    
    
    //二叉树的遍历--前序遍历   先根-左->右
    public static void preTravel(TreeNode node){
        if(node==null){
          return;    
        }
        printNode(node);
        preTravel(node.left);
        preTravel(node.right);
    }
    //二叉树的遍历--中序遍历   先左->根->右
        public static void midTravel(TreeNode node){
            if(node==null){
              return;    
            }
            midTravel(node.left);
            printNode(node);
            midTravel(node.right);
        }
        //二叉树的遍历--后序遍历   先左->右->根
                public static void lastTravel(TreeNode node){
                    if(node==null){
                      return;    
                    }
                    lastTravel(node.left);
                    lastTravel(node.right);
                    printNode(node);
                }
    
    private static void printNode(TreeNode node) {
        // TODO Auto-generated method stub
        System.out.print("  "+node.value);
    }


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] pre={1,2,4,7,3,5,6,8};
        int[] mid={4,7,2,1,5,3,8,6};
        TreeNode node=createTree(pre,mid);
        System.out.println("前序遍历:");
        preTravel(node);
        System.out.println("\n中序遍历:");
        midTravel(node);
        System.out.println("\n后序遍历:");
        lastTravel(node);
    
    }

}

 

前序遍历:
  1  2  4  7  3  5  6  8
中序遍历:
  4  7  2  1  5  3  8  6
后序遍历:
  7  4  2  5  8  6  3  1

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值