21. 构造二叉树
时间限制:1.000S 空间限制:32MB
题目描述
给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。
输入描述
输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写字母组成。
输出描述
对于每组输入,输出对应的二叉树的后续遍历结果。
输入示例
DBACEGF ABCDEFG
BCAD CBAD
输出示例
ACBFGED
CDAB
解法一(递归+hash)
思路分析:
- 手动构建二叉树节点
- 通过递归的方式 按后序遍历输出二叉树
- 通过哈希的方式缓存记录中序遍历字符的索引;并通过递归的方式构造二叉树
实现代码如下:
java
public class k_21_ConstructBinaryTree {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String pre = in.next();
String inOrder = in.next();
Map<Character, Integer> inMap = new HashMap<>();
int preLen = pre.length();
int inLen = inOrder.length();
for (int i = 0; i < inLen; ++ i) {
inMap.put(inOrder.charAt(i), i);
}
TreeNode root = buildTree(pre, 0, preLen-1, inMap, 0, inLen-1);
postOrderTraversal(root);
System.out.println();
}
}
private static TreeNode buildTree(String pre, int preStart, int preEnd, Map<Character, Integer> inMap, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) {
return null;
}
// 根据前序遍历获取根节点
char val = pre.charAt(preStart);
TreeNode root = new TreeNode(val);
// 获取左右子树区间
Integer index = inMap.get(val);
root.left = buildTree(pre, preStart+1, index-inStart+preStart, inMap, inStart, index-1);
root.right = buildTree(pre, index-inStart+preStart+1, preEnd, inMap, index+1, inEnd);
return root;
}
// 二叉树后序遍历
private static void postOrderTraversal(TreeNode root) {
// 后序遍历 左右中
if (root == null) {
return;
}
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.val);
}
public static class TreeNode {
char val;
TreeNode right;
TreeNode left;
public TreeNode() {
}
public TreeNode(char val) {
this.val = val;
}
}
}
运行结果如下:
运行时间: 356ms 消耗内存: 12812kb
复杂度分析:
- 时间复杂度:
- 空间复杂度: