二叉樹的建立、二叉排序樹、前序、中序、後序、層次遍歷
阿新 • • 發佈:2019-02-05
<pre name="code" class="java">package com.sun.example1; import java.util.LinkedList; import java.util.Queue; class Node { public int data; public Node left; public Node right; public Node(int data) { this.data = data; this.left = null; this.right = null; } } public class BinaryTree { private Node root; public BinaryTree() { root = null; } public void insert(int data) { Node newNode = new Node(data); if (root == null) { root = newNode; } else { Node current = root; Node parent; while (true) { parent = current; if (data < current.data) { current = current.left; if (current == null) { parent.left = newNode; return; } } else { current = current.right; if (current == null) { parent.right = newNode; return; } } } } } public void bulidTree(int[] data) { for (int i = 0; i < data.length; i++) { insert(data[i]); } } public void inOrder(Node localRoot) { if (localRoot != null) { inOrder(localRoot.left); System.out.print(localRoot.data + " "); inOrder(localRoot.right); } } public void preOrder(Node localNode) { if (localNode != null) { System.out.print(localNode.data + " "); preOrder(localNode.left); preOrder(localNode.right); } } public void postOrder(Node localNode) { if (localNode != null) { postOrder(localNode.left); postOrder(localNode.right); System.out.print(localNode.data + " "); } } public void layerTranverse() { if (this.root == null) { return; } Queue<Node> q = new LinkedList<Node>(); q.add(this.root); while (!q.isEmpty()) { Node n = q.poll(); System.out.print(n.data + " "); if (n.left != null) { q.add(n.left); } if (n.right != null) { q.add(n.right); } } } public void initTree(int[] preOrder, int[] inOrder) { this.root = this.doInitTree(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1); } public Node doInitTree(int[] preOrder, int start1, int end1, int[] inOrder, int start2, int end2) { if (start1 > end1 || start2 > end2) { return null; } Node root = new Node(preOrder[start1]); for (int i = start2; i <= end2; i++) { root.left = doInitTree(preOrder, start1 + 1, start1 + i - start2, inOrder, start2, i - 1); root.right = doInitTree(preOrder, start1 + i + 1 - start2, end1, inOrder, i + 1, end2); } return root; } public int findIndexInArray(int[] a, int x, int begin, int end) { for (int i = 0; i <= end; i++) { if (a[i] == x) { return i; } } return -1; } public static void main(String[] args) { BinaryTree biTree = new BinaryTree(); int[] data = { 2, 8, 7, 4, 9, 3, 1, 6, 7, 5 }; biTree.bulidTree(data); biTree.inOrder(biTree.root); System.out.println(); biTree.preOrder(biTree.root); System.out.println(); biTree.postOrder(biTree.root); System.out.println("層次"); biTree.layerTranverse(); System.out.println(); System.out.println("********************************************"); BinaryTree tree = new BinaryTree(); int[] preOrder = { 1, 2, 4, 8, 9, 5, 10, 3, 6, 7 }; int[] inOrder = { 8, 4, 9, 2, 10, 5, 1, 6, 3, 7 }; tree.initTree(preOrder, inOrder); System.out.print("二叉樹的後序遍歷:"); tree.postOrder(tree.root); } }