给一个二叉树的前序和中序序列,求二叉树的层序序列
来源:互联网 发布:网络娱乐游戏如何注册 编辑:程序博客网 时间: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
- 给一个二叉树的前序和中序序列,求二叉树的层序序列
- 给一个二叉树的前序和中序序列,求二叉树的层序序列
- 根据中序序列和前序序列,求二叉树的后序序列
- 已知二叉树的前序序列和中序序列,求二叉树的后序序列
- 从二叉树的前序遍历序列和中序遍历序列重构出二叉树
- 由二叉树的前序序列和中序序列构建二叉树
- 根据二叉树的前序遍历序列和中序遍历序列求二叉树的后序遍历序列
- 根据二叉树的前序序列和中序序列得到后序序列
- 【C++】非递归求二叉树的前序和中序序列
- 由二叉树的前序遍历序列和中序遍历序列求后序遍历序列
- 知道前序序列和后序序列求二叉树的个数+大数
- 已知前序遍历序列和中序遍历序列,求二叉树的后序遍历
- 已知二叉树的中序序列和前序序列(或后序)求解树
- 已知二叉树的中序序列和前序序列(或后序)求解树
- POJ 2255 根据二叉树的前序和中序序列来重建二叉树
- 根据二叉树的前序和中序序列来重建二叉树
- 已知二叉树的前序和中序序列,不建立二叉树来输出后序序列
- 已知二叉树的前序和中序序列,构建二叉树并求后序序列,java实现。
- 变态跳台阶
- 后缀表达式与中缀表达式求值
- 2017.04.02【NOIP 普及组】模拟赛C组
- codeforce Round #404 D(数学,思路,范德蒙恒等式)
- SpringMVC:使用 POJO 对象绑定请求参数值
- 给一个二叉树的前序和中序序列,求二叉树的层序序列
- 蓝桥杯 剪格子 (DFS)
- HDU 4876 ZCC loves cards
- 学习笔记整理——Find 命令,附带练习题及答案。
- 傅里叶级数详解
- DFS 递归 迷宫
- SSH面试知识
- 今日头条2017暑期实习生招聘笔试编程题之函数最宽尖峰
- 2017跟着小虎玩着去软考--项目管理师上午试题之十(解析2016下半年信息系统项目管理师上午试题41-45题)