Java现在键盘输入结点和一颗二叉树的先序遍历序列和中序遍历序列,试着找出它的后序遍历序列。
时间: 2023-12-27 11:03:54 浏览: 72
给出先序遍历和中序遍历,求二叉树后序遍历
5星 · 资源好评率100%
可以先根据给定的先序遍历和中序遍历序列构建二叉树,然后再对构建好的二叉树进行后序遍历即可得到后序遍历序列。
具体步骤如下:
1. 根据先序遍历序列确定二叉树的根节点,假设其值为rootVal。
2. 在中序遍历序列中找到rootVal所在的位置,将中序遍历序列分为左子树和右子树两部分。
3. 分别递归处理左子树和右子树,得到左子树的先序遍历序列preOrderLeft、中序遍历序列inOrderLeft,以及右子树的先序遍历序列preOrderRight、中序遍历序列inOrderRight。
4. 对左子树和右子树分别进行递归操作,得到左子树的后序遍历序列postOrderLeft和右子树的后序遍历序列postOrderRight。
5. 将postOrderLeft、postOrderRight和rootVal依次加入到结果中,得到二叉树的后序遍历序列。
Java代码如下:
```
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String preOrderStr = sc.nextLine(); // 先序遍历序列
String inOrderStr = sc.nextLine(); // 中序遍历序列
char[] preOrder = preOrderStr.toCharArray();
char[] inOrder = inOrderStr.toCharArray();
int n = preOrder.length;
Map<Character, Integer> map = new HashMap<>(); // 存储中序遍历序列中每个节点对应的下标
for (int i = 0; i < n; i++) {
map.put(inOrder[i], i);
}
TreeNode root = buildTree(preOrder, inOrder, 0, n - 1, 0, n - 1, map);
List<Character> postOrderList = new ArrayList<>();
postOrderTraversal(root, postOrderList);
for (char c : postOrderList) {
System.out.print(c);
}
}
// 根据先序遍历序列和中序遍历序列构建二叉树
public static TreeNode buildTree(char[] preOrder, char[] inOrder, int preLeft, int preRight, int inLeft, int inRight, Map<Character, Integer> map) {
if (preLeft > preRight) {
return null;
}
char rootVal = preOrder[preLeft];
TreeNode root = new TreeNode(rootVal);
int inOrderRootIndex = map.get(rootVal);
int leftTreeSize = inOrderRootIndex - inLeft;
root.left = buildTree(preOrder, inOrder, preLeft + 1, preLeft + leftTreeSize, inLeft, inOrderRootIndex - 1, map);
root.right = buildTree(preOrder, inOrder, preLeft + leftTreeSize + 1, preRight, inOrderRootIndex + 1, inRight, map);
return root;
}
// 后序遍历二叉树
public static void postOrderTraversal(TreeNode root, List<Character> list) {
if (root != null) {
postOrderTraversal(root.left, list);
postOrderTraversal(root.right, list);
list.add(root.val);
}
}
}
class TreeNode {
char val;
TreeNode left;
TreeNode right;
public TreeNode(char val) {
this.val = val;
}
}
```
输入样例:
```
ABDECFG
DBEAFCG
```
输出样例:
```
DEBFGCA
```
阅读全文