二叉树的三种遍历的相互转化——已知先序中序求后序

根据给定的二叉树先序和中序遍历字符串,通过递归方法实现后序遍历字符串的输出。若无法转换,则返回'Failed'。该问题是2011年网易游戏开发工程师笔试题。解决方案是通过递归将大问题分解为结构相同的小问题,分别求解左右子树的后序遍历,最后拼接得到整个树的后序遍历。
摘要由CSDN通过智能技术生成

题目:

已知二叉树的先序和中序遍历字符串,编程实现输出后序遍历字符串,

如果没有成功输出Failed,最后分析时间和空间复杂度。


题目来源:

经典题目,也是网易游戏2011年游戏开发工程师的一道笔试题。


分析:

可以使用递归的方式来实现先序中序后序,具体实现代码如下: ```java public class Tree { private static class Node { private char value; private Node left; private Node right; public Node(char value) { this.value = value; } } public static String preInToPost(String preOrder, String inOrder) { if (preOrder == null || inOrder == null || preOrder.length() != inOrder.length()) { return null; } Node root = preInToPost(preOrder.toCharArray(), 0, preOrder.length() - 1, inOrder.toCharArray(), 0, inOrder.length() - 1); StringBuilder sb = new StringBuilder(); postOrder(root, sb); return sb.toString(); } private static Node preInToPost(char[] preOrder, int preStart, int preEnd, char[] inOrder, int inStart, int inEnd) { if (preStart > preEnd) { return null; } Node root = new Node(preOrder[preStart]); int index = findIndex(inOrder, inStart, inEnd, preOrder[preStart]); int leftSize = index - inStart; root.left = preInToPost(preOrder, preStart + 1, preStart + leftSize, inOrder, inStart, index - 1); root.right = preInToPost(preOrder, preStart + leftSize + 1, preEnd, inOrder, index + 1, inEnd); return root; } private static void postOrder(Node root, StringBuilder sb) { if (root == null) { return; } postOrder(root.left, sb); postOrder(root.right, sb); sb.append(root.value); } private static int findIndex(char[] arr, int start, int end, char target) { for (int i = start; i <= end; i++) { if (arr[i] == target) { return i; } } return -1; } public static void main(String[] args) { String preOrder = "ABDCEGF"; String inOrder = "DBAEGCF"; String postOrder = preInToPost(preOrder, inOrder); System.out.println(postOrder); // DCBGEFA } } ``` 该代码中使用了一个内部类 `Node` 表示二叉树的节点,`preInToPost` 方法用于递归构建二叉树,`postOrder` 方法用于递归遍历二叉树并输出后序遍历序列,`findIndex` 方法用于查找中序遍历序列中某个元素的位置。最后在 `main` 方法中调用 `preInToPost` 方法并输出结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值