• 二叉树重建


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

    package com.huawei;
    
    import java.util.Scanner;
    
    class Node {
    Node left = null;
    Node right = null;
    int value;
    int size;
    }
    public class BinaryTreeBuilder {
    /**
    * 根据前序遍历和中序遍历重建二叉树子树
    * @param preOrder 前序遍历数组
    * @param start 子树起始位置
    * @param inOrder 中序遍历数组
    * @param end 中序遍历结束位置
    * @param length 子树节点树
    * @return 子树的根节点
    */
    public static Node buildTree(char[] preOrder, int start,
    char[] inOrder, int end, int length) {
    //参数验证
    if (preOrder == null || preOrder.length == 0 || inOrder == null
    || inOrder.length == 0 || length <= 0) {
    return null;
    }
    
    //建立子树根节点
    char value = preOrder[start];
    Node root = new Node();
    root.value = value;
    
    //递归终止条件:子树只有一个节点
    if (length == 1)
    return root;
    
    //分拆子树的左子树和右子树
    int i = 0;
    while (i < length) {
    if (value == inOrder[end - i]) {
    break;
    }
    i++;
    }
    
    //建立子树的左子树
    root.left = buildTree(preOrder, start + 1, inOrder, end - i - 1, length - 1 - i);
    //建立子树的右子树
    root.right = buildTree(preOrder, start + length - i, inOrder, end, i );
    
    return root;
    }
    public static void getTree(Node root){
    if(root == null){
    System.out.println("No");
    return;
    }
    if(root.left != null){
    getTree(root.left);
    }
    if(root.right != null){
    getTree(root.right);
    }
    System.out.print(root.value + " ");
    }
    
    public static Node rebuild(int[] preOrder, int startPre, int endPre, int[] inOrder, int startIn, int endIn){
    
    if(endPre - startPre != endIn - startIn){
    return null;
    }
    
    if(startPre > endPre){
    return null;
    }
    
    Node root = new Node();
    root.value = preOrder[startPre];
    root.size = 1;
    root.left = null;
    root.right = null;
    
    if(startPre == endPre){
    return root;
    }
    
    int index, length;
    for(index=startIn; index<=endIn; index++){
    if(inOrder[index] == preOrder[startPre]){
    break;
    }
    }
    
    if(index > endIn){
    return null;
    }
    
    if(index > startIn){
    length = index - startIn;
    root.left = rebuild(preOrder, startPre+1, startPre+length, inOrder, startIn, startIn+length-1);
    if(root.left != null)
    root.size += root.left.size;
    }
    if(index < endIn){
    length = endIn - index;
    root.right = rebuild(preOrder, endPre-length+1, endPre, inOrder, endIn-length+1, endIn);
    if(root.right != null)
    root.size += root.right.size;
    }
    return root;
    }
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    while(sc.hasNext()){
    int n = sc.nextInt();
    int[] preOrder = new int[n]; //{'1', '2', '4', '7', '3', '5', '6', '8'};
    int[] inOrder = new int[n]; //{'4', '7', '2', '1', '5', '3', '8', '6'};
    //    String preStr = sc.next();
    //    System.out.println(preStr.length());
    //    String inStr = sc.nextLine();
    for(int i=0; i<n; i++){
    preOrder[i] = sc.nextInt();//.charAt(0);
    //    inOrder[i] = inStr.charAt(i);
    }
    for(int i=0; i<n; i++){
    //    preOrder[i] = sc.next().charAt(0);
    inOrder[i] = sc.nextInt();//.charAt(0);
    }
    Node root = rebuild(preOrder,0,n-1,inOrder,0,n-1);//buildTree(preOrder, 0, inOrder, inOrder.length - 1, inOrder.length);
    if(root.size == n)
    getTree(root);
    else{
    System.out.println("No");
    }
    System.out.println();
    }
    sc.close();
    }
    }
  • 相关阅读:
    常见局域网类别
    精确率,召回率,准确率
    create-react-app创建第一个react程序_windows8.1
    编码与解码
    深度学习---嵌套简记
    反向传播算法简记
    MarkDown语法简记
    Vscode中的配置文件的作用简述
    wireshark 更好的查看TCP协议的数据,跟踪tcp流程
    wireshark 基础,颜色规则,过滤条件使用与多条过滤
  • 原文地址:https://www.cnblogs.com/woniu4/p/4625487.html
Copyright © 2020-2023  润新知