求和树--前序、中序序列递归构建二叉树

将满二叉树转换为求和树

https://www.nowcoder.com/questionTerminal/b31734e46ba644de85a9cf95bbd57a5f

import java.util.*;

public class SumTree {

static int[] preOrder;
static int[] inOrder;
static List<Integer> inOrderRes;

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String[] str1 = sc.nextLine().trim().split(" ");
    String[] str2 = sc.nextLine().trim().split(" ");
    int len = str1.length;

    preOrder = new int[len];
    inOrder = new int[len];

    for (int i = 0; i < len; i++) {
        preOrder[i] = Integer.parseInt(str1[i]);
        inOrder[i] = Integer.parseInt(str2[i]);
    }

    // 存放求和后的中序序列
    inOrderRes = new ArrayList<>();
    // 构建树,返回root节点
    Node root = buildTree(0, 0, len - 1);// len - 1 =
                                            // 6,结尾处索引必须是<=(67行)子序列末端,不能是len = 7(这样右子树会出问题),
    sumNode(root);
    inOrderTral(root);
    for (int i : inOrderRes) {
        System.out.print(i + " ");
    }
    System.out.println();
}

// 中序遍历
static void inOrderTral(Node node) {
    if (node == null)
        return;
    inOrderTral(node.left);
    inOrderRes.add(node.sum);
    inOrderTral(node.right);
}

// 根据构建的二叉树补充sum值
static void sumNode(Node node) {
    if (node.left == null && node.right == null) {
        node.sum = 0;
    } else if (node.left == null) {
        sumNode(node.right);
        node.sum = node.right.sum + node.right.val;
    } else if (node.right == null) {
        sumNode(node.left);
        node.sum = node.left.sum + node.left.val;
    } else {
        sumNode(node.left);
        sumNode(node.right);
        node.sum = node.left.sum + node.left.val + node.right.sum
                + node.right.val;
    }
}

// 递归构建二叉树
static Node buildTree(int root, int start, int end) {
    if (start > end)    // 当start == end时,就是叶子节点了
        return null;
    // 创建一个root节点
    Node node = new Node(preOrder[root]);
    int index = 0;// 记录root在中序序列中的下标
    int count = 0;// 记录在前序中root右孩子与root的距离
    for (int i = start; i <= end; i++) {
        count++;
        if (preOrder[root] == inOrder[i]) {
            index = i;
            break;
        }
    }
    // 递归构建当前节点的左右子树
    node.left = buildTree(root + 1, start, index - 1);// 前序中root右边第一个位置即左孩子
    // 注意右孩子在前序序列中的下标root + count
    node.right = buildTree(root + count, index + 1, end);
    return node;
}

}

public class Node {

Node left = null;
Node right = null;
int val;
int sum;
public Node(int value) {
    val = value;
}

}

全部评论

相关推荐

程序员猪皮:看不到八股什么意思
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务