先序遍歷二叉樹的兩種方法(遞歸及非遞歸)

先序遍歷就是按照 根節點 => 左子樹 => 右子樹 的順序訪問。

其實:

先序、中序、後序遍歷,主要是對根節點讀取順序而言的。

下面介紹下兩種具體的遍歷方法。

1、首先先定義一個樹節點類信息,如下:

package com.dz.demo.algorithm;

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

2、遞歸調用比較簡單,具體如下:

    private static void preOrderRecursive(TreeNode root) {
        if (root == null) return;
        System.out.println(root.val);
        preOrderRecursive(root.left);
        preOrderRecursive(root.right);
    }

3、非遞歸的方法主要是藉助棧結構來完成:

    private static void preOrderUnRecursive(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.empty()) {
            TreeNode temp = stack.pop();

            if (temp == null) continue;

            System.out.println(temp.val);

            // 明確棧的進出順序,先進後出,所以先序遍歷,先push右子樹
            stack.push(temp.right);
            stack.push(temp.left);
        }
    }

4、測試,如下二叉樹:

    public static void main(String[] args) {
        TreeNode root = new TreeNode(5);
        TreeNode cLeft1 = new TreeNode(3);
        TreeNode cRight1 = new TreeNode(7);
        TreeNode clLeft2 = new TreeNode(2);
        TreeNode clRight2 = new TreeNode(4);
        TreeNode crLeft2 = new TreeNode(6);
        TreeNode crRight2 = new TreeNode(8);

        root.left = cLeft1;
        root.right = cRight1;
        cLeft1.left = clLeft2;
        cLeft1.right = clRight2;
        cRight1.left = crLeft2;
        cRight1.right = crRight2;

//        preOrderRecursive(root);
        preOrderUnRecursive(root);
    }

5、結果如下:

Connected to the target VM, address: '127.0.0.1:55176', transport: 'socket'
5
3
2
4
7
6
8
Disconnected from the target VM, address: '127.0.0.1:55176', transport: 'socket'

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章