package ds.tree; /** * 使用二叉链表实现二叉树。 */ public class BinaryTree<T> { /** * 结点类。 */ class Node { int value; // 该节点存储的值。 Node leftChild; // 指向左子节点的引用。 Node rightChild; // 指向右子节点的引用。 Node(int value) { this.value = value; leftChild = null; rightChild = null; } } private Node root; // 根节点。 /** * 无参构造方法。 */ BinaryTree() { root = null; } /** * 使用一个数组来构造二叉树。 * @param arr 值的数组。 */ BinaryTree(int[] arr) { for (int i : arr) { insert(i); } } private void insert(int value) { root = insert(root, value); } /** * 将数值插入到二叉树中,比当前结点小或等于当前结点的插在当前结点的左侧, * 比当前结点大的数插在当前结点的右侧,每次从根结点开始递归比较。 * @param node 当前的结点,就是根结点,只是每次根结点的左右子孙更新。 * @param value 要插入的值。 * @return 插值结束后的树的根节点。 */ private Node insert(Node node, int value) { if (node == null) { node = new Node(value); } else { if (value <= node.value) { node.leftChild = insert(node.leftChild, value); } else { node.rightChild = insert(node.rightChild, value); } } return node; } /** * 访问节点:将节点的值取出来并打印。 * @param node 需访问的节点。 */ private void visit(Node node) { /** * 当节点为空时返回。 */ if (node == null) { return; } int value = node.value; System.out.println(value); } /** * 从指定节点作为根节点开始递归对树进行先序遍历。 * @param node 指定节点。 */ private void preOrderTravels(Node node) { if (node == null) { return; } else { visit(node); preOrderTravels(node.leftChild); preOrderTravels(node.rightChild); } } /** * 从根节点开始对整个树进行先序遍历。 */ public void preOrderTravels() { preOrderTravels(root); } }
package ds.tree; public class Test { public static void main(String[] args) { int arr[] = {12,33,79,1,11,56}; BinaryTree tree = new BinaryTree(arr); tree.preOrderTravels(); } }