樹的構造函數、生成樹、 後續遍歷樹

  1. 構造樹
    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;
    }
}
  1. 後續遍歷樹
    在不構造樹的情況下
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();

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章