树结构
public class Tree {
public char element;
public Tree left;
public Tree right;
}
三种遍历:
只是顺序的不同
public class TreeTraverse {
private static String seq = "";
private static void Visit(char element) {
seq += element;
}
//先序
public static String preOrderT(Tree tree) {
Visit(tree.element);
if (tree.left != null)
preOrderT(tree.left);
if (tree.right != null)
preOrderT(tree.right);
return seq;
}
//中序
public static String inOrderT(Tree tree) {
if (tree.left != null)
inOrderT(tree.left);
Visit(tree.element);
if (tree.right != null)
inOrderT(tree.right);
return seq;
}
//后序
public static String postOrderT(Tree tree) {
if (tree.left != null)
postOrderT(tree.left);
if (tree.right != null)
postOrderT(tree.right);
Visit(tree.element);
return seq;
}
}
通过遍历序列还原:
无其他附加条件时有两种方法:
通过先序和中序遍历序列还原;
通过后序和中序遍历序列还原;
步骤:
在后序遍历序列中得到根节点(子树最后一个节点)
在先序遍历中找到该节点位置
将树分成左子树和右子树
递归找到各自的根节点。
public class RetrieveTree {
public static String preOrder = "zWbTghHV3oPp8LFGuAfn01rmwxJ7eiQYZ25vKqk9yCBNDU4lcMIEaOj6SRXsdt";
public static String inOrder = "TbHVh3ogPWFLuAfGrm1xJ7we0iQYnZ8Kvqk9y5CNBD24UlcpIEMaj6SROXsdzt";
public static String postOrder = "TVHo3hPgbFfAumr7Jxew1YQi0ZnGLKy9kqvNDBC54clU28EIRS6jdsXOaMpWtz";
public Tree retrieveBy_In_Post(String in, String post) {
Tree tree = new Tree();
int n = post.length() - 1;
//Q1
char root = post.charAt(n);
System.out.println("root " + root);
tree.element = root;
int index = in.indexOf(root);
//Q2
if (index > 0) {
String inLeft = in.substring(0, index);
String postLeft = post.substring(0, index);
tree.left = retrieveBy_In_Post(inLeft, postLeft);
} else {
tree.left = null;
}
//Q3
if (index < n) {
String inRight = in.substring(index + 1);
String postRight = post.substring(index, n);
tree.right = retrieveBy_In_Post(inRight, postRight);
} else {
tree.right = null;
}
return tree;
}
public static void main(String[] args) {
RetrieveTree rt = new RetrieveTree();
Tree tree = rt.retrieveBy_In_Post(inOrder, postOrder);
System.out.println(TreeTraverse.preOrderT(tree));
}
}
Q & A:
Q1:根据后序遍历的特点,树的根结点最后遍历到;
而且对于同一子树,两种遍历序列的长度是一样的;
但划分子树时要注意截取的位置,中序遍历根节点在中间而后序遍历根节点在末端;
Q2:如果有左子树则截取出左子树的序列;
Q3:如果有右子树则截取出右子树的序列;