二叉排序樹,新增節點,前序遍歷,中序遍歷,後續遍歷

package com.xbb.demo.exam;

/**
 * 該類爲按原始要求寫的,未添加任何原始框架以外的方法;
 * 因要求二要求中序遍歷按從小到大排序,所以按左子列爲小,右子列爲大新增節點.
 */
public class BinaryTree {

    public static void main(String[] args) {

        final int[] values = { 1, 3, 4, 5, 2, 8, 6, 7, 9, 0 };
        // TODO:
        Node node = null;
        for (int value:values) {
            node = createBinaryTree(node,value);
        }
        inOrderTransval(node);
    }

    /**
     * 原始要求:通過一個方法
     * 比較新加的值與原節點的大小;
     * 如果原節點值大於等於新增節點,返回True(代表放入左)
     * 如果原節點值小於新增節點,返回False(代表放入右)
     * @param node
     * @param value
     * @return
     */
    public static Node createBinaryTree(Node node,int value){
        // TODO:
        // 如果節點爲空,代表爲根節點,創建根節點寫入當前值並返回
        if (node == null){
            return new Node(value);
        }else{
            // 根據左右寫入規則,判斷新增節點Value與當前節點Value的大小,從而判斷寫入左列還是右列
            // 新節點值<=當前節點 寫入左列
            if (node.getValue() >= value){
                // 判斷當前節點下是否爲爲空,
                // 如果不爲空則遞歸進入當前方法尋找下一個節點
                if (node.getLeft() != null){
                    createBinaryTree(node.getLeft(),value);
                // 如果爲空則創建節點寫入新值
                }else{
                    node.setLeft(new Node(value));
                }
            // 否則,寫入右列
            }else{
                // 判斷當前節點下是否爲爲空,
                // 如果不爲空則遞歸進入當前方法尋找下一個節點
                if (node.getRight() != null){
                    createBinaryTree(node.getRight(),value);
                }else{
                    // 如果爲空則創建節點寫入新值
                    node.setRight(new Node(value));
                }
            }
            return node;
        }
    }

    /**
     * 中序排序輸出
     * @param node
     */
    public static void inOrderTransval(Node node) {
        // TODO:
        // 結束遞歸條件:節點爲空
        if (node == null) return ;
        // 如果當前節點左節點不爲空,遞歸排序左子
        if (node.getLeft() != null){
            inOrderTransval(node.getLeft());
        }
        System.out.print(node.getValue()+",");
        // 如果當前節點右節點不爲空,遞歸排序右子
        if (node.getRight() != null){
            inOrderTransval(node.getRight());
        }
    }
}
class Node {

    // 節點值
    private int value;

    // 左節點
    private Node left;

    // 右節點
    private Node right;

    public Node(int value){
        this.value = value;
    }

    // TODO:
    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章