树的不同形态(源自:小红书2019校园招聘笔试)

树的不同形态

(源自:小红书校园招聘技术类在线笔试)

题目描述

给定二叉树T(树深度不超过H<=10,深度从1开始,节点个数N<1024,节点编号1~N)的层序和中序遍历,输出T从左向右叶子节点以及树先序和后序遍历序列

输入描述:
输入两行,分别代表层序和中序遍历结果,节点编号按单个空格分开

输出描述:
依次输出 从左向右叶子节点 ,先序, 后序 遍历 。 节点编号按空格分开

示例1
输入

3 5 4 2 6 7 1
2 5 3 6 4 7 1

输出

2 6 1
3 5 2 4 6 7 1
2 5 6 1 7 4 3

解答

链接:https://www.nowcoder.com/questionTerminal/54713e2ad6ac4a6baa52838cff09662a?f=discussion
来源:牛客网

import java.util.*;
 
class TreeNode {
    public String val;
    public TreeNode left;
    public TreeNode right;
 
    public TreeNode(String val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}
 
public class Main {
    public static StringBuilder sb1 = new StringBuilder();
    public static StringBuilder sb2 = new StringBuilder();
    public static StringBuilder sb3 = new StringBuilder();
 
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String[] levelTranversal = scan.nextLine().split(" ");
        String[] inOrderTranversal = scan.nextLine().split(" ");
        scan.close();
        //
        TreeNode root = getBinaryTree(levelTranversal, inOrderTranversal);
        preOrder(root);
        lastOrder(root);
        //
        System.out.println(sb1.toString().trim());
        System.out.println(sb2.toString().trim());
        System.out.println(sb3.toString().trim());
    }
 
    public static TreeNode getBinaryTree(String[] levelTranversal, String[] inOrderTranversal) {
        if (inOrderTranversal.length == 0)
            return null;
        //
        int index = 0;
        int inOrderTranversalLength = inOrderTranversal.length;
        TreeNode temp = new TreeNode(levelTranversal[0]);
        // 1. 找到这一轮的根节点
        while (!levelTranversal[0].equals(inOrderTranversal[index])) {
            index++;
        }
        // 2. 两数组存放中序序列划分出来的左边和右边,其分别包含了原二叉树的左子树和右子树
        String[] inOrderTranversalLeft = new String[index];
        String[] inOrderTranversalRight = new String[inOrderTranversalLength - index - 1];
        // 复制填充数据
        System.arraycopy(inOrderTranversal, 0, inOrderTranversalLeft, 0, inOrderTranversalLeft.length);
        for (int i = 0; i < inOrderTranversalRight.length; i++) {
            inOrderTranversalRight[i] = inOrderTranversal[index + i + 1];
        }
        // 3. 存放原二叉树左子树的层级序列,即中序序列划分出来的左边对应的层级序列。右边同理。
        String[] levelTranversalLeft = new String[inOrderTranversalLeft.length]; 
        String[] levelTranversalRight = new String[inOrderTranversalRight.length];
        // 填充数据
        int leftIndex = 0, rightIndex = 0;
        for (int i = 1; i < levelTranversal.length; i++) {
            // 是左的放左,否则就是右的,放右
            if (contains(inOrderTranversalLeft, levelTranversal[i])) {
                levelTranversalLeft[leftIndex++] = levelTranversal[i];
            }else {
                levelTranversalRight[rightIndex++] = levelTranversal[i];
            }
        }
        // 4. 递归处理左节点和右节点
        temp.left = getBinaryTree(levelTranversalLeft, inOrderTranversalLeft);
        temp.right = getBinaryTree(levelTranversalRight, inOrderTranversalRight);
        // 5. 存放叶子节点
        if (temp.left == null && temp.right == null) {
            sb1.append(temp.val).append(" ");
        }
        return temp;
    }
     
    private static boolean contains(String[] arr, String key) {
        for (String element : arr) {
            if (element.equals(key)) return true;
        }
        return false;
    }
 
    public static void preOrder(TreeNode root) {
        if (root != null) {
            sb2.append(root.val).append(" ");
            preOrder(root.left);
            preOrder(root.right);
        }
    }
 
    public static void lastOrder(TreeNode root) {
        if (root != null) {
            lastOrder(root.left);
            lastOrder(root.right);
            sb3.append(root.val).append(" ");
        }
    }
}
发布了115 篇原创文章 · 获赞 22 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42956047/article/details/105367759