1. 程式人生 > >java實現二叉樹的遍歷(遞迴和非遞迴)

java實現二叉樹的遍歷(遞迴和非遞迴)

現有一顆如下圖所示的二叉樹:

這裡寫圖片描述

其遍歷的各種方式如下:

這裡寫圖片描述
這裡寫圖片描述

構造一顆如下圖所示的二叉樹,用java實現其前序,中序,後序遍歷

這裡寫圖片描述

注意二叉樹節點的定義如下:

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

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

遞迴實現:

// 用遞迴的方法進行先序遍歷
    public void qinaxuDigui(TreeNode treeNode) {
        qianxuNumList.add(treeNode.val);
        if
(treeNode.left != null) { qinaxuDigui(treeNode.left); } if (treeNode.right != null) { qinaxuDigui(treeNode.right); } } // 用遞迴的方法進行中序遍歷 public void zhongxuDigui(TreeNode treeNode) { if (treeNode.left != null) { zhongxuDigui(treeNode.left); } zhongxuNumList.add(treeNode.val); if
(treeNode.right != null) { zhongxuDigui(treeNode.right); } } // 用遞迴的方法進行後序遍歷 public void houxuDigui(TreeNode treeNode) { if (treeNode.left != null) { houxuDigui(treeNode.left); } if (treeNode.right != null) { houxuDigui(treeNode.right); } houxuNumList.add(treeNode.val); }

非遞迴實現:

// 用非遞迴的方法進行先序遍歷
    public void qinaxuFeiDigui(TreeNode treeNode) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while (treeNode != null || !stack.isEmpty()) {
            while (treeNode != null) {
                qianxuNumList.add(treeNode.val);
                stack.push(treeNode);
                treeNode = treeNode.left;
            }
            if(!stack.isEmpty()){
                treeNode = stack.pop();
                treeNode = treeNode.right;
            }
        }
    }

    // 用非遞迴的方法進行中序遍歷
    public void zhongxuFeiDigui(TreeNode treeNode) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while (treeNode != null || !stack.isEmpty()) {
            while (treeNode != null) {
                stack.push(treeNode);
                treeNode = treeNode.left;
            }
            if (!stack.isEmpty()) {
                treeNode = stack.pop();
                zhongxuNumList.add(treeNode.val);
                treeNode = treeNode.right;
            }
        }
    }

    // 用非遞迴的方法進行後序遍歷
    public void houxuFeiDigui(TreeNode treeNode) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while (treeNode != null || !stack.isEmpty()) {
            while (treeNode != null) {
                stack.push(treeNode);
                treeNode = treeNode.left;
            }
            boolean tag = true;
            TreeNode preNode = null;  // 前驅節點
            while (!stack.isEmpty() && tag == true) {
                treeNode = stack.peek();
                if (treeNode.right == preNode) { // 之前訪問的為空節點或是棧頂節點的右子節點
                    treeNode = stack.pop();
                    houxuNumList.add(treeNode.val);
                    if (stack.isEmpty()) {
                        return;
                    } else {
                        preNode = treeNode;
                    }
                } else {
                    treeNode = treeNode.right;
                    tag = false;
                }
            }
        }
    }

執行結果如下:

這裡寫圖片描述