二叉樹遍歷 -- JAVA

唐少愛科研發表於2020-12-07

《漫畫演算法--小灰的演算法之旅》

二叉樹是典型的非線性資料結構,遍歷時候需要把非線性關聯的節點轉換成一個線性序列,以不同的方式進行遍歷,遍歷出的順序也不相同。

常用的遍歷方式是:前序遍歷、中序遍歷、後序遍歷;(個人理解所謂的前序、中序、後序指的是根節點遍歷的順序是前?是中?是後?

package com.java.array;

public class BinaryTree {
    // 前序遍歷
    public static void preOrderTraveral(TreeNode node) {
        if (node == null) {
            return;
        }
        System.out.println(node.data);
        preOrderTraveral(node.leftChild);
        preOrderTraveral(node.rightChild);
    }

    // 後序遍歷
    public static void postOrderTraveral(TreeNode node) {
        if (node == null) {
            return;
        }
        preOrderTraveral(node.leftChild);
        preOrderTraveral(node.rightChild);
        System.out.println(node.data);
    }


    // 中序遍歷
    public static void inOrderTraveral(TreeNode node) {
        if (node == null) {
            return;
        }
        preOrderTraveral(node.leftChild);
        System.out.println(node.data);
        preOrderTraveral(node.rightChild);
    }
    
}

class TreeNode {
    int data;
    TreeNode leftChild;
    TreeNode rightChild;

    public TreeNode(int data) {
        this.data = data;
    }
}


上述是採用遞迴的方式進行遍歷。

(1)棧的資料結構進行二叉樹的前序遍歷

    /**
     * 二叉樹非遞迴的前序遍歷
     *
     * @param root 根節點
     */
    public static void preOrderTraveralWithStack(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode treeNode = root;

        while (treeNode != null || !stack.isEmpty()) {
            //迭代訪問節點的左孩子,併入棧
            while (treeNode != null) {
                System.out.println(treeNode.data);
                stack.push(treeNode.leftChild);
                treeNode = treeNode.leftChild;
            }
            // 如果節點沒有左孩子,則彈出棧頂節點,訪問節點右孩子
            while (!stack.isEmpty()) {
                treeNode = stack.pop();
                treeNode = treeNode.rightChild;
            }
        }
    }

 (2)二叉樹的層序遍歷

 /**
     * 二叉樹的廣義遍歷
     *
     * @param root 根節點
     */
    public static void levelOrderTraversal(TreeNode root) {
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode treeNode = queue.poll();
            System.out.println(treeNode);
            if (treeNode.leftChild != null) {
                queue.offer(treeNode.leftChild);
            }
            if (treeNode.rightChild != null) {
                queue.offer(treeNode.rightChild);
            }
        }
    }

 

 

 

 

 

相關文章