標籤:java 二叉樹 深度優先遍曆 遞迴
深度優先遍曆二叉樹。
1. 中序遍曆的遞迴演算法:
若二叉樹為空白,則演算法結束;否則:
中序遍曆根結點的左子樹;
訪問根結點;
中序遍曆根結點的右子樹。
2. 前序走訪的遞迴演算法:
若二叉樹為空白,則演算法結束,否則:
訪問根結點;
前序走訪根結點的左子樹;
前序走訪根結點的右子樹。
3. 後序遍曆的遞迴演算法:
若二叉樹為空白,則演算法結束,否則:
後序遍曆根結點的左子樹;
後序遍曆根結點的右子樹;
訪問根結點。
package com.test6;/** * 二叉樹 * * 描述: 1、二叉樹的構建 2、前序遞迴遍曆,中序遞迴遍曆,後續遞迴遍曆 3、測試 * * @author sdc * * @param <E> */public class BinaryTree<E> {/** * 二叉樹的根節點 */TreeNode root;/** * 樹的大小 */private int size;/** * 指定某個元素為根節點 * * @param data */public BinaryTree(E data) {this.root = new TreeNode((int) data);}/** * 返回樹的大小 * * @return */public int getSize() {return this.size;}/** * 構建二叉樹 * * @param node * @param data */public void buildBinaryTree(TreeNode node, int data) {if (root == null) { // 判斷根根節點是否為空白root = new TreeNode(data);} else { // 已經有根節點,建立二叉樹if (data < node.data) {if (node.left == null) {node.left = new TreeNode(data);} else {buildBinaryTree(node.left, data);}} else {if (node.right == null) { // 如果右子樹沒有,要把此節點當成右節點,建立node.right = new TreeNode(data);} else {buildBinaryTree(node.right, data);}}}}/** * 先序遍曆,前序遞迴遍曆 * * 描述:遍曆到該節點後,首先輸出該節點的值,並繼續遍曆左右子樹,順序:(根->左->右) * * @param node */public void preOrder(TreeNode node) {if (node == null) {return;}System.out.print(node.data + "->");preOrder(node.left);preOrder(node.right);}/** * 中序節點遞迴遍曆 * * 描述:遍曆到該節點後,首先將節點暫存,遍曆完左子樹後再輸出該節點的值,並繼續遍曆根節點右子樹,順序:(左->根->右) * * @param node */public void midOrder(TreeNode node) {if (node == null) {return;}midOrder(node.left);System.out.print(node.data + "->");midOrder(node.right);}/** * 後序節點遞迴遍曆 * * 描述:遍曆到該節點後,首先將節點暫存,遍曆完左子樹後並繼續遍曆根節點右子樹,最後輸出順序。順序:(左->右->跟) * * @param node */public void postOrder(TreeNode node) {if (node == null) {return;}postOrder(node.left);postOrder(node.right);System.out.print(node.data + "->");}/** * 尋找一個節點的值 * * @param data * @return */public boolean search(int data) {boolean isFlag = false;TreeNode node = root;while (true) {if (data == node.data) {isFlag = true;break;} else if (data > node.data) {node = node.right;if (node == null) {break;}} else {node = node.left;if (node == null) {break;}}}return isFlag;}public static void main(String[] args) {int[] array = { 12, 9, 20, 5, 11, 39, 3 };BinaryTree<Integer> bt = new BinaryTree<Integer>(array[0]);for (int i = 0; i < array.length; i++) {bt.buildBinaryTree(bt.root, array[i]);}// 三種遍曆bt.preOrder(bt.root);System.out.println();bt.midOrder(bt.root);System.out.println();bt.postOrder(bt.root);}/** * 二叉樹結構 * * @author sdc * */class TreeNode {int data;TreeNode left;TreeNode right;public TreeNode(int data) {this.data = data;this.left = null;this.right = null;}}}
java 二叉樹 深度優先遞迴遍曆