给一个二叉树的前序和中序序列,求二叉树的层序序列

来源:互联网 发布:网络娱乐游戏如何注册 编辑:程序博客网 时间:2024/06/05 15:28

题目:给一个二叉树的前序和中序序列,求二叉树的层序序列

(2017年去哪儿网春招笔试题)


思路:给定前序序列和中序序列,可以唯一构造出一颗二叉树,再利用队列进行层序遍历二叉树即可。

关键

一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树。

       根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root),  然后在中序序列(InSequence)中查找此根(root),  根据中序遍历特点, 知在查找到的根(root) 前边的序列为根的左子树的中序遍历序列,  后边的序列为根的右子树的中序遍历序列。 设在中序遍历序列(InSequence)根前边有left个元素. 则在前序序列(PreSequence)中, 紧跟着根(root)的left个元素序列(即PreSequence[1...left]) 为根的左子树的前序遍历序列, 在后边的为根的右子树的前序遍历序列.而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为PreSequence[1...left]), 中序序列为InSequence[0...left-1], 分别为原序列的子串, 构造右子树同样, 显然可以用递归方法解决。


代码:

import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;public class qunarTest3 {    private static class BNode{BNode left;BNode right;int data;public BNode(int data){this.data = data;}} public static BNode buildBTree(int i, int j, int u, int v, int[] pre, int[] mid){//i,j为前序数组pre开始和结束的下标;u,v为中序数组mid开始和结束的下标。int k, l; //k 为中序遍历的root下标; l 为前序遍历左子树最后一个结点下标BNode head = null, s = null;if(j >= i){int data = pre[i];head = new BNode(data);k = u;while(mid[k] != pre[i]){k++;}l = i + k - u;  //前序遍历中左子树最后一个结点的下标,利用左子树头结点i+1,加上根据中序遍历算出的左子树结点个数k-u-1,                //加起来就是左子树最后一个结点的下标。if(k == u){head.left = null;  //如果中序的root结点下标k等于中序数组开始结点下标,意味着左子树为空}else{s = buildBTree(i+1, l, u, k-1, pre, mid);head.left = s;}if(k == v){head.right = null;  //如果中序的root结点下标k等于中序数组结束结点下标,意味着右子树为空}else{s = buildBTree(l+1, j, k+1, v, pre, mid);head.right = s;}}return head;}public static void layerScann(BNode root){Queue<BNode> q = new LinkedList<BNode>();q.add(root);while(!q.isEmpty()){BNode node = q.poll();System.out.print(node.data+" ");if(node.left != null){q.add(node.left);}if(node.right != null){q.add(node.right);}}}public static void main(String[] args) {// TODO Auto-generated method stub        Scanner sc = new Scanner(System.in);        int n = sc.nextInt();        int[] pre = new int[n];        int[] mid = new int[n];        for (int i = 0; i < n; i++) { pre[i] = sc.nextInt();}for (int i = 0; i < n; i++) {mid[i] = sc.nextInt();}        BNode root = buildBTree(0, n - 1, 0, n - 1, pre, mid);        layerScann(root);}}


0 0
原创粉丝点击