华为OD机试 2024D卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。
现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请输出层次遍历的结果。
二、输入描述
输入为两个字符串,分别是二叉树的后续遍历和中序遍历结果。
三、输出描述
输出二叉树的层次遍历结果。
四、解题思路
为了从后序遍历和中序遍历结果构建二叉树,然后输出层次遍历结果,我们可以按照以下步骤进行:
- 从后序遍历和中序遍历构建二叉树:
- 后序遍历的最后一个节点是根节点。
- 在中序遍历中找到该根节点,根节点左边的部分是左子树,右边的部分是右子树。
- 递归地对左右子树重复上述过程,直到构建完整的二叉树。
- 进行层次遍历:
- 使用队列进行层次遍历,从根节点开始,将每一层的节点加入队列,并依次输出。
五、Java算法源码
public class Test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入的后序遍历和中序遍历字符串
String postOrder = scanner.next();
String inOrder = scanner.next();
// 构建二叉树
TreeNode root = buildTree(postOrder, inOrder);
// 输出层次遍历结果
String levelOrderResult = levelOrderTraversal(root);
System.out.println(levelOrderResult);
scanner.close();
}
// 根据后序遍历和中序遍历构建二叉树
private static TreeNode buildTree(String postOrder, String inOrder) {
if (postOrder.isEmpty() || inOrder.isEmpty()) {
return null;
}
return buildTreeHelper(postOrder, 0, postOrder.length() - 1, inOrder, 0, inOrder.length() - 1);
}
// 递归辅助函数构建二叉树
private static TreeNode buildTreeHelper(String postOrder, int postStart, int postEnd, String inOrder, int inStart, int inEnd) {
if (postStart > postEnd || inStart > inEnd) {
return null;
}
// 后序遍历的最后一个节点是根节点
char rootVal = postOrder.charAt(postEnd);
TreeNode root = new TreeNode(rootVal);
// 在中序遍历中找到根节点的位置
int rootIndex = inOrder.indexOf(rootVal);
// 计算左子树的大小
int leftTreeSize = rootIndex - inStart;
// 构建左子树
root.left = buildTreeHelper(postOrder, postStart, postStart + leftTreeSize - 1, inOrder, inStart, rootIndex - 1);
// 构建右子树
root.right = buildTreeHelper(postOrder, postStart + leftTreeSize, postEnd - 1, inOrder, rootIndex + 1, inEnd);
return root;
}
// 层次遍历二叉树并输出结果
private static String levelOrderTraversal(TreeNode root) {
if (root == null) {
return "";
}
StringBuilder result = new StringBuilder();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode current = queue.poll();
result.append(current.val);
if (current.left != null) {
queue.add(current.left);
}
if (current.right != null) {
queue.add(current.right);
}
}
return result.toString();
}
}
class TreeNode {
char val;
TreeNode left;
TreeNode right;
TreeNode(char x) {
val = x;
}
}
六、效果展示
1、输入
CBEFDA CBAEDF
2、输出
ABDCEF
3、说明
二叉树为:
A
/
B D
/ /
C E F
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。