1. 程式人生 > >Java 實現二叉樹插入和遍歷

Java 實現二叉樹插入和遍歷

定義節點類

package com.drj.tree;
/**
*
* @ClassName: TreeNode
* @Description:TODO(代表樹節點)
* @author: drj
* @date: 2018年8月22日 下午9:32:13
*
* @Copyright: 2018
*
*/

public class TreeNode {
private TreeNode leftTreeNode;
private TreeNode rightTreeNode;
private String value;

public TreeNode getLeftTreeNode() {
    return leftTreeNode;
}

public void setLeftTreeNode(TreeNode leftTreeNode) {
    this.leftTreeNode = leftTreeNode;
}

public TreeNode getRightTreeNode() {
    return rightTreeNode;
}

public void setRightTreeNode(TreeNode rightTreeNode) {
    this.rightTreeNode = rightTreeNode;
}

public String getValue() {
    return value;
}

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

public TreeNode(String value) {
    super();
    this.value = value;
}

@Override
public String toString() {
    return "TreeNode [leftTreeNode=" + leftTreeNode + ", rightTreeNode=" + rightTreeNode + ", value=" + value + "]";
} }

實現插入、遍歷

package com.drj.tree;

/**
*
* @ClassName: BinaryTree
* @Description:TODO(二叉樹實現)
* @author: drj
* @date: 2018年8月22日 下午9:46:02
*
* @Copyright: 2018
*
*/

public class BinaryTree {
private TreeNode root;

public TreeNode getRoot() {
    return root;
}

/**
 * 插入二叉樹排序 有序插入 (大於根節點放右邊 小於根節點放左邊)
 * 
 * @param value
 */
public void insert(String value) {

    TreeNode newNode = new TreeNode(value);
    if (root == null) {
        root = newNode;
        root.setLeftTreeNode(null);
        root.setRightTreeNode(null);
    } else {
        TreeNode currentNode = root;
        TreeNode parentNode;
        // 有孩子繼續迴圈,一直迴圈到最後一個節點 和插入的節點比較 大的放到右節點,小於放到左節點
        while (true) {
            parentNode = currentNode;
            // 往右放
            if (Integer.valueOf(newNode.getValue()) > Integer.valueOf(currentNode.getValue())) {
                currentNode = currentNode.getRightTreeNode();
                if (currentNode == null) {
                    parentNode.setRightTreeNode(newNode);
                    return;
                }
            } else {
                // 往左放
                currentNode = currentNode.getLeftTreeNode();
                if (currentNode == null) {
                    parentNode.setLeftTreeNode(newNode);
                    return;
                }
            }
        }
    }
}

/**
 * 中序遍歷
 * 
 * @param treeNode
 */
public void inOrder(TreeNode treeNode) {
    if (treeNode != null) {
        inOrder(treeNode.getLeftTreeNode());
        System.out.print(" " + treeNode.getValue() + " ");
        inOrder(treeNode.getRightTreeNode());
    }
}

/**
 * 後序遍歷
 * 
 * @param treeNode
 */
public void afterOrder(TreeNode treeNode) {
    if (treeNode != null) {
        afterOrder(treeNode.getLeftTreeNode());
        afterOrder(treeNode.getRightTreeNode());
        System.out.print(" " + treeNode.getValue() + " ");
    }
}

/**
 * 先序遍歷
 * 
 * @param treeNode
 */
public void beforeOrder(TreeNode treeNode) {
    if (treeNode != null) {
        System.out.print(" " + treeNode.getValue() + " ");
        beforeOrder(treeNode.getLeftTreeNode());
        beforeOrder(treeNode.getRightTreeNode());
    }
}

public static void main(String[] args) {
    BinaryTree tree = new BinaryTree();
    tree.insert("5");
    tree.insert("7");
    tree.insert("4");
    tree.insert("8");
    tree.insert("6");
    tree.insert("2");
    tree.insert("3");
    tree.insert("9");
    System.out.println(tree.root);
    tree.beforeOrder(tree.getRoot());
    System.out.println();
    tree.inOrder(tree.getRoot());
    System.out.println();
    tree.afterOrder(tree.getRoot());

} }

結果

測試

本測試二叉樹

二叉樹