给出二叉树先序和中序数组,打印后序遍历结果
给出二叉树样例:
/****************************************************************************
A A
/ \ / \
B C B C
/ \ / / \ / \
D E F D E F G
\ \ / / \ / \
G H H I J K L
先序:A-B-D-G-E-C-F-H A-B-D-E-H-C-F-I-J-G-K-L
中序:D-G-B-E-A-F-H-C D-B-H-E-A-I-F-J-C-K-G-L
后序:G-D-E-B-H-F-C-A D-H-E-B-I-J-F-K-L-G-C-A
*************************************************************************/
题目分析:
先序遍历:根节点-左子树-右子树
中序遍历:左子树-根节点-右子树
由先序和中序数组可以确认二叉树左右子树;根据二叉树性质,二叉树的左右子树分别为二叉树;递归添加即可实现该二叉树。
以下为具体实现:
public class BinaryTreeQuestion{
private static class TreeNode<E> {
private E element;
private TreeNode left,right;
public TreeNode(E element) {
this.element = element;
}
}
// 生成二叉树
private static TreeNode add(String[] argsPre,String[] argsIn){
if(argsPre.length < 1) return null;
if(argsPre.length == 1) return new TreeNode(argsPre[0]);
TreeNode<String> node = new TreeNode<>(argsPre[0]);
node.left = add(Arrays.copyOfRange(argsPre,1,rootIndex(argsPre,argsIn)+1),Arrays.copyOfRange(argsIn,0,rootIndex(argsPre,argsIn)));
node.right = add(Arrays.copyOfRange(argsPre,rootIndex(argsPre,argsIn)+1,argsPre.length),Arrays.copyOfRange(argsIn,rootIndex(argsPre,argsIn)+1,argsIn.length));
return node;
}
// 返回根节点下标
private static int rootIndex(String[] args1,String[] args2){
for (int i = 0; i < args2.length ; i++) {
if(args1[0].equals(args2[i]))
return i;
}
return 0;
}
// 后序遍历
private static void afterOrder(TreeNode<String> root){
if(root == null){
return ;
}
afterOrder(root.left);
afterOrder(root.right);
System.out.print(root.element+"\t");
}
public static void main(String[] args) {
String[] argsPre = {"A","B","D","G","E","C","F","H"};
String[] argsIn = {"D","G","B","E","A","F","H","C"};
String[] argsPre1 = {"A","B","D","E","H","C","F","I","J","G","K","L"};
String[] argsIn1 = {"D","B","H","E","A","I","F","J","C","K","G","L"};
System.out.println("预计结果:G-D-E-B-H-F-C-A");
afterOrder(add(argsPre,argsIn));
System.out.println();
System.out.println("预计结果:D-H-E-B-I-J-F-K-L-G-C-A");
afterOrder(add(argsPre1,argsIn1));
}
}
测试结果:
预计结果:G-D-E-B-H-F-C-A
G D E B H F C A
预计结果:D-H-E-B-I-J-F-K-L-G-C-A
D H E B I J F K L G C A
Process finished with exit code 0