面试中,二叉树也是经常被问题的一个问题,今天复习之。
1.前序遍历:根,左,右
2.中序遍历:左,根,右
3.后序遍历:左,右,根
4.层序遍历:从左到右
注意一点就是这个顺序是以根节点为基准的
package com.suanfa.tree; import java.util.ArrayList; /** * 节点类 还可以定义成泛型:Node<E> */ class Node { public Node left; public Node right; public int data; Node(int newData) { left = null; right = null; data = newData; } } public class BinaryTree { public static void main(String[] args) { BinaryTree biTree = new BinaryTree(); int[] data = { 2, 8, 7, 4, 9, 3, 1, 6, 7, 5 }; biTree.buildTree(data); // biTree.printTree(root); preOrder(root); // inOrder(root); // postOrder(root); // layerOrder(root); } private static Node root; /** * 创建一个空的二叉树 */ public BinaryTree() { root = null; } /** * 将数值插入到二叉树中,比当前结点小或等于当前结点的插在当前结点的左侧,比当前结点大的数插在当前结点的右侧,每次从根结点开始递归比较 * * @param node * 当前的结点,就是根结点,只是每次根结点的左右子孙更新 * @param data * 要插入的数值 * @return 新排好的二叉树 */ private Node insert(Node node, int data) { if (node == null) { node = new Node(data); } else { if (data <= node.data) { node.left = insert(node.left, data); } else { node.right = insert(node.right, data); } } return node; } /** * 将数值输入构建二叉树 * * @param data * 要输入的数值 */ public void buildTree(int[] data) { for (int i = 0; i < data.length; i++) { insert(root, data[i]); } } /** * 从根结点开始遍历,从树的最高层叶子结点开始输出,从左至右 * <pre> * 这个相当于中序遍历 * @param node 当前的结点 */ private static void printTree(Node node) { if (node == null) { return; } // left, node itself, right printTree(node.left); System.out.print(node.data + " "); printTree(node.right); } /** * 前序遍历 * * @param root */ public static void preOrder(Node root) { if (root != null) { System.out.print(root.data + "-"); preOrder(root.left); preOrder(root.right); } } /** * 中序遍历 * * @param root */ public static void inOrder(Node root) { if (root != null) { inOrder(root.left); System.out.print(root.data + "--"); inOrder(root.right); } } /** * 后续遍历 * * @param root */ public static void postOrder(Node root) { if (root != null) { postOrder(root.left); postOrder(root.right); System.out.print(root.data + "---"); } } /** * 层序遍历 * * @param root */ public static void layerOrder(Node root) { // 创建队列 ArrayList<Node> q = new ArrayList<Node>(); q.add(root); while (q.size() > 0) { // 出列 root = (Node) q.get(0); q.remove(0); // 访问队列头部节点 System.out.print(root + "→"); if (root.left != null) // 将节点的左子节点保存至队列 q.add(root.left); if (root.right != null) // 将节点的右子节点保存至队列 q.add(root.right); } } }
参考链接:
http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591042.html
http://wenku.baidu.com/view/4090656da98271fe910ef9a5.html
http://wenku.baidu.com/view/760e05dd5022aaea998f0fba.html