問題:根據先序遍歷和中序遍歷,求解后序遍歷
思路:
- 第一步,將先序和中序字符串進行劃分。
先序:1--247--3568,中序:472--1--5386,由此可見,數字247屬于左邊的樹結點,數字3568屬于右邊的樹結點,1屬于根結點 - 第二步,根據第一步的規律,進行遞歸賦值。頂點作為根結點。分別設置其左右結點,如果沒有則為Null。
- PS:substring方法傳入的第一個參數不能大于字符串長度或者為負數。并且當參數相同時,返回的字符串長度為0。
二叉樹.png
代碼實現:
public class N06 {
public static void main(String[] args) {
String preOrder = "12473568";
String inOrder = "47215386";
BinaryTree binaryTree = new BinaryTree(preOrder, inOrder);
TreeNode root = binaryTree.root;
System.out.println("pre order: ");
binaryTree.preTreeTraverse(root);
System.out.println();
System.out.println("in order: ");
binaryTree.inTreeTraverse(root);
System.out.println();
System.out.println("post order: ");
binaryTree.postTreeTreverse(root);
System.out.println();
}
}
class BinaryTree {
TreeNode root;
public BinaryTree(String preOrder, String inOrder) {
if (preOrder.length() == 0)
return;
char key = preOrder.charAt(0);
int index = inOrder.indexOf(key);
root = new TreeNode(key);
this.root.setLeftNode(new BinaryTree(preOrder.substring(1, index + 1), inOrder.substring(0, index)).root);
this.root.setRightNode(new BinaryTree(preOrder.substring(index + 1),inOrder.substring(index+1)).root);
}
public void preTreeTraverse(TreeNode root) {
//先序遍歷
if (root != null) {
System.out.print(root.data+" ");
preTreeTraverse(root.leftNode);
preTreeTraverse(root.rightNode);
}
}
public void inTreeTraverse(TreeNode root) {
//中序遍歷
if (root != null) {
inTreeTraverse(root.leftNode);
System.out.print(root.data+" ");
inTreeTraverse(root.rightNode);
}
}
public void postTreeTreverse(TreeNode root) {
//后序遍歷
if (root != null) {
postTreeTreverse(root.leftNode);
postTreeTreverse(root.rightNode);
System.out.print(root.getData()+" ");
}
}
}
class TreeNode {
char data;
TreeNode leftNode;
TreeNode rightNode;
public TreeNode(char data) {
this.data = data;
}
public char getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
public TreeNode getLeftNode() {
return leftNode;
}
public void setLeftNode(TreeNode leftNode) {
this.leftNode = leftNode;
}
public TreeNode getRightNode() {
return rightNode;
}
public void setRightNode(TreeNode rightNode) {
this.rightNode = rightNode;
}
}