- 構造樹
final修飾:對基本類型使用final不能改變的是它的數值(只能get,不能set)
public char getValue() {
return value;
}
package testPro;
public class TreeNode {
private final char value;
private TreeNode left;
private TreeNode right;
private TreeNode parent;
public TreeNode(char value){
this.value=value;
this.left=null;
this.right=null;
}
public char getValue() {
return value;
}
public TreeNode getLeft() {
return left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return right;
}
public void setRight(TreeNode right) {
this.right = right;
}
public TreeNode getParent() {
return parent;
}
public void setParent(TreeNode parent) {
this.parent = parent;
}
}
2. 生成樹
package testPro;
/**
* 有兩個方法
* 1)構造樹的SampleTree
* 2)由前序遍歷和中序遍歷 構造樹
*/
public class TreeCreator {
public TreeNode createSampleTree(){
TreeNode root =new TreeNode('A');
root.setLeft(new TreeNode('B'));
root.getLeft().setLeft(new TreeNode('D'));
root.getLeft().setRight(new TreeNode('E'));
root.getLeft().getRight().setLeft(new TreeNode('G'));
root.setRight(new TreeNode('C'));
root.getRight().setRight(new TreeNode('F'));
return root;
}
/**
*
* @param preOrder 前序遍歷字符串
* @param inOrder 中序遍歷字符串
* @return 樹的根節點root
*/
public TreeNode createTree(String preOrder,String inOrder){
if( preOrder.isEmpty()){//判斷空串的情況
return null;
}
char rootValue=preOrder.charAt(0);
int rootIndex=inOrder.indexOf(rootValue);
TreeNode root =new TreeNode(rootValue);
/**
* root 的左子樹
*/
root.setLeft(createTree(
preOrder.substring(1,1+ rootIndex),
inOrder.substring(0,rootIndex)
));
/**
* root 的左子樹
*/
root.setRight(
createTree(
preOrder.substring(1+ rootIndex),
inOrder.substring(1+rootIndex)//跳躍root節點
) );
return root;
}
}
- 後續遍歷樹
在不構造樹的情況下
package testPro;
//遍歷類
public class TreeTraversal {
public void postOrder(TreeNode root){//後序遍歷
if(root==null)
return ;
postOrder(root.getLeft());
postOrder(root.getRight());
System.out.print(root.getValue());
}
/**
* 在不構造樹的情況下
* 輸出後序遍歷的結果
* @param args
*/
public String postOrder(String preOrder,String inOrder) {
if (preOrder.isEmpty()) {//判斷空串的情況
return "";
}
char rootValue = preOrder.charAt(0);
int rootIndex = inOrder.indexOf(rootValue);
return
postOrder(
preOrder.substring(1, 1 + rootIndex),
inOrder.substring(0, rootIndex)) +
postOrder(
preOrder.substring(1 + rootIndex),
inOrder.substring(1 + rootIndex))+//跳躍root節點
rootValue;
}
public static void main(String[] args) {
TreeTraversal traversal =new TreeTraversal();
System.out.println("Generating postOrder directly");
System.out.println("===========");
System.out.println(
traversal.postOrder("ABDEGCF","DBGEACF"));
}
}
也可以先生成樹,再遍歷。
public static void main(String[] args) {
TreeCreator creator =new TreeCreator();
TreeTraversal traversal =new TreeTraversal();
System.out.println("Createing tree from preOrder and inOrder");
System.out.println("===========");
TreeNode tree=creator.createTree("ABDEGCF","DBGEACF");
traversal.postOrder(tree);//遍歷構成的樹tree ,通過後續遍歷打印
System.out.println();
}