NO.07 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
例如输入的前序遍历序列{1,2,4,7,3,5,6,8}, 和中序遍历序列{4,7,2,1,5,3,8,6}. 最后请输出该二叉树的后序遍历结果。
先写个二叉树的类BinaryTreeNode
public class BinaryTreeNode {
private char data;
private BinaryTreeNode LchildNode;
private BinaryTreeNode RchildNode;
public BinaryTreeNode(char data) {
super();
this.data = data;
}
public BinaryTreeNode(char data, BinaryTreeNode LchildNode,
BinaryTreeNode RchildNode){
super();
this.data = data;
this.LchildNode = LchildNode;
this.RchildNode = RchildNode;
}
public char getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
public BinaryTreeNode getLchildNode() {
return LchildNode;
}
public void setLchildNode(BinaryTreeNode lchildNode) {
LchildNode = lchildNode;
}
public BinaryTreeNode getRchildNode() {
return RchildNode;
}
public void setRchildNode(BinaryTreeNode rchildNode) {
RchildNode = rchildNode;
}
}
算法实现代码:
public class NO07 {
//根据前序遍历和中序遍历建立二叉树
public static void main(String[] args) {
String preOrder="12473568";
String midOrder="47215386";
BinaryTree tree=new BinaryTree(preOrder, midOrder, preOrder.length());
//后序遍历
tree.postRootTraverse(tree.root);
}
}
class BinaryTree{
BinaryTreeNode root;
public BinaryTree(String preOrder, String midOrder, int count){
if (count <= 0){
return;
}
char c = preOrder.charAt(0);
int i = 0;
for (; i < count; i++) {
if(c == midOrder.charAt(i)){
break;
}
}
root = new BinaryTreeNode(c);
root.setLchildNode(new BinaryTree(preOrder.substring(1,i + 1), midOrder.substring(0,i), i).root);
root.setRchildNode(new BinaryTree(preOrder.substring(i + 1), midOrder.substring(i + 1), count - 1 - i).root);
}
public void postRootTraverse(BinaryTreeNode root){
if (root != null){
postRootTraverse(root.getLchildNode());
postRootTraverse(root.getRchildNode());
System.out.println(root.getData());
}
}
}
此题的重点在于递归地进行二叉树的创建以及遍历。递归是重中之重,检验debug一下加深理解。