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();
        }
    }
  • 相关阅读:
    在SQLite中使用索引优化查询速度
    SQLite支持的SQL数据操作
    left (outer) join , right (outer) join, full (outer) join, (inner) join, cross join 区别
    深入理解Android内存管理原理(六)
    Merge Sorted Array
    Sort Colors
    Construct Binary Tree from Preorder and Inorder Traversal
    Binary Tree Postorder Traversal
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/zadomn0920/p/6361807.html
Copyright © 2011-2022 走看看