Java现在给出一颗二叉树的先序遍历序列和中序遍历序列,试着找出它的后序遍历序列。
时间: 2023-12-30 20:02:28 浏览: 63
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
可以利用递归的思想来解决这个问题。首先根据先序遍历序列确定树的根节点,然后在中序遍历序列中找到该节点的位置,该位置左侧的部分为树的左子树的中序遍历序列,右侧的部分为树的右子树的中序遍历序列。然后根据左子树的节点个数,可以在先序遍历序列中确定左子树的先序遍历序列和右子树的先序遍历序列。然后递归求解左子树和右子树的后序遍历序列,最后将根节点加入到后序遍历序列的末尾即可。
具体的实现可以参考下面的Java代码:
```java
public class BinaryTree {
public static void main(String[] args) {
int[] preOrder = {1, 2, 4, 5, 3, 6, 7};
int[] inOrder = {4, 2, 5, 1, 6, 3, 7};
int[] postOrder = getPostOrder(preOrder, inOrder);
System.out.println(Arrays.toString(postOrder)); // [4, 5, 2, 6, 7, 3, 1]
}
public static int[] getPostOrder(int[] preOrder, int[] inOrder) {
int n = preOrder.length;
if (n == 0) {
return new int[0];
}
int rootValue = preOrder[0];
int rootIndex = 0;
for (int i = 0; i < n; i++) {
if (inOrder[i] == rootValue) {
rootIndex = i;
break;
}
}
int leftSize = rootIndex;
int rightSize = n - rootIndex - 1;
int[] leftPreOrder = Arrays.copyOfRange(preOrder, 1, leftSize + 1);
int[] rightPreOrder = Arrays.copyOfRange(preOrder, leftSize + 1, n);
int[] leftInOrder = Arrays.copyOfRange(inOrder, 0, rootIndex);
int[] rightInOrder = Arrays.copyOfRange(inOrder, rootIndex + 1, n);
int[] leftPostOrder = getPostOrder(leftPreOrder, leftInOrder);
int[] rightPostOrder = getPostOrder(rightPreOrder, rightInOrder);
int[] postOrder = new int[n];
System.arraycopy(leftPostOrder, 0, postOrder, 0, leftSize);
System.arraycopy(rightPostOrder, 0, postOrder, leftSize, rightSize);
postOrder[n - 1] = rootValue;
return postOrder;
}
}
```
阅读全文