原文链接:http://www.dubby.cn/detail.html?id=9058
已知前序遍历和中序遍历:
前序遍历: GDAFEMHZ
中序遍历: ADEFGHMZ
求:后序遍历
- 我们根据前序遍历可以找到第一个root节点;
- 然后这个根据中序遍历可以知道这个root节点在哪里;
- 如果root两边都有元素,说明这个root有左子树和右子树;
- 如果root只有左边有元素,说明这个root只有左子树;
- 如果root只有右边有元素,说明这个root只有右子树。
- 然后递归的处理,就可以从root节点往下,梳理出整个树的结构。
public static String[] getPostOrder1(String[] preOrder, String[] inOrder) {
currentPreLeft = 0;
TreeNode<String> root = generateTree(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
List<String> temp = new PostOrder<String>().travelWithRecursion(root);
String[] result = new String[preOrder.length];
return temp.toArray(result);
}
private static int currentPreLeft = 0;
private static TreeNode<String> generateTree(String[] preOrder, int preLeft, int preRight, String[] inOrder, int inLeft, int inRight) {
TreeNode<String> root = new TreeNode<>();
root.setValue(preOrder[preLeft]);
currentPreLeft++;
int rootIndex = indexAt(inOrder, root.getValue());
if (rootIndex > inLeft && rootIndex < inRight) {
//根节点有左右子节点
root.setLeft(generateTree(preOrder, currentPreLeft, preRight, inOrder, inLeft, rootIndex - 1));
root.setRight(generateTree(preOrder, currentPreLeft, preRight, inOrder, rootIndex + 1, inRight));
} else if (rootIndex > inLeft) {
//根节点只有左子节点
root.setLeft(generateTree(preOrder, currentPreLeft, preRight, inOrder, inLeft, rootIndex - 1));
} else if (rootIndex < inRight) {
//根节点只有右子节点
root.setRight(generateTree(preOrder, currentPreLeft, preRight, inOrder, rootIndex + 1, inRight));
}
return root;
}
测试代码:
public static void main(String[] args) {
//前序遍历
final String[] preOrder = {"G", "D", "A", "F", "E", "M", "H", "Z"};
System.out.println("前序遍历:" + String.join(", ", preOrder));
//中序遍历
final String[] inOrder = {"A", "D", "E", "F", "G", "H", "M", "Z"};
System.out.println("中序遍历:" + String.join(", ", inOrder));
System.out.println("后序遍历:" + String.join(", ", getPostOrder1(preOrder, inOrder)));
}
测试结果:
前序遍历:G, D, A, F, E, M, H, Z
中序遍历:A, D, E, F, G, H, M, Z
后序遍历:A, E, F, D, H, Z, M, G
微信扫码关注订阅号,获取更多精彩内容