zoukankan      html  css  js  c++  java
  • 已知先序遍历和中序遍历,求后序遍历

    描述

    先序序列{1,2,4,8,9,5,10,3,6,7};
    中序序列{8,4,9,2,10,5,1,6,3,7};
    求后序序列。

    代码

    class Node{
        public int data;
        public Node left;
        public Node right;
        public Node(int data){
            this.data=data;
            this.left=null;
            this.right=null;
        }
    }
    
    public class BinaryTree {
        private Node root;
        public BinaryTree(){
            root=null;
        }
    
        /*
        * 初始化树
        * */
        public void initTree(int[] preOrder,int[] inOrder){
            root=buildTree(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1);
        }
        /*
        * 递归法,建立左右子树
        * */
        public Node buildTree(int[] preOrder,int start1,int end1,int[] inOrder,int start2,int end2){
            if(start1>end1 || start2>end2) return null;
    
            //先序序列中首字符则为根结点
            int rootData=preOrder[start1];
            Node head=new Node(rootData);
            //从中序序列inOrder的[start2,end2]中找到该结点rootData的下标,即可确定左子树和右子树的边界
            int rootIndex=findIndexInArray(inOrder,rootData,start2,end2);
            //确定左子树有多少结点,从而能确定先序序列中的左子树部分。
            int leftLen=rootIndex-start2;
            //构建左子树
            Node left=buildTree(preOrder,start1+1,start1+leftLen,inOrder,start2,rootIndex-1);
            //构建右子树
            Node right=buildTree(preOrder,start1+leftLen+1,end1,inOrder,rootIndex+1,end2);
    
            head.left=left;
            head.right=right;
            return head;
        }
    
        /*
        * 从数组a的[begin,end]中找到x的下标
        * */
        public int findIndexInArray(int[] a,int x,int begin,int end){
            for(int i=begin;i<=end;i++){
                if(x==a[i]) return i;
            }
            return -1;
        }
        
        /*
        * 后序遍历
        * */
        public void postOrder(){
            postOrder(root);
        }
        public void postOrder(Node node){
            if(node==null) return;
            postOrder(node.left);
            postOrder(node.right);
            System.out.print(node.data+" ");
        }
    
        public static void main(String[] args) {
            BinaryTree bitree=new BinaryTree();
            int[] preOrder={1,2,4,8,9,5,10,3,6,7};
            int[] inOrder={8,4,9,2,10,5,1,6,3,7};
            bitree.initTree(preOrder,inOrder);
            bitree.postOrder();
        }
    }
  • 相关阅读:
    c++ STL中的vector与list为什么没有提供find操作?
    转发:CAOZ星球提问。 遇到很大瓶颈,想离职又不敢离职怎么办
    转发 :caoz:数据分析这点事
    那些绕不开的Linux
    记录 《 Bootstrap 基础教程》 学习笔记 第一天
    迈出你的第一步——天助自助者
    this指向问题
    小结
    前端小白的福利
    真实案例分享
  • 原文地址:https://www.cnblogs.com/zadomn0920/p/6361807.html
Copyright © 2011-2022 走看看