树的不同形态
(源自:小红书校园招聘技术类在线笔试)
题目描述
给定二叉树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(" ");
}
}
}