美文网首页
二叉树遍历

二叉树遍历

作者: A邱凌 | 来源:发表于2019-11-05 16:26 被阅读0次

二叉树遍历

二叉树遍历分为先序中序后序,是否递归,实现方法和原理注释都在下方

import java.util.Stack;

public class BinaryTree {
    /*
     * 遍历二叉树, 先序 中序  后序   递归 非递归
     * */

    public static void main(String[] args) {
        /*
         *                   构造一颗树
         *                       1
         *                      / \
         *                     2   3
         *                    / \   \
         *                   4   5   6
         *                  / \     / \
         *                 7  10   8   9
         * */
        TreeNode treeNode1 = new TreeNode(1);
        TreeNode treeNode2 = new TreeNode(2);
        TreeNode treeNode3 = new TreeNode(3);
        TreeNode treeNode4 = new TreeNode(4);
        TreeNode treeNode5 = new TreeNode(5);
        TreeNode treeNode6 = new TreeNode(6);
        TreeNode treeNode7 = new TreeNode(7);
        TreeNode treeNode8 = new TreeNode(8);
        TreeNode treeNode9 = new TreeNode(9);
        TreeNode treeNode10 = new TreeNode(10);

        treeNode1.left = treeNode2;
        treeNode1.right = treeNode3;
        treeNode2.left = treeNode4;
        treeNode2.right = treeNode5;
        treeNode3.right = treeNode6;
        treeNode4.left = treeNode7;
        treeNode4.right = treeNode10;

        treeNode6.left = treeNode8;
        treeNode6.right = treeNode9;
        PostOrderTraversalWithRecursive(treeNode1);
    }


    /*
     * 先序递归方法 顺序 中 左 右
     * */
    public static void preOrderTraversalWithRecursive(TreeNode treeNode) {
        if (treeNode == null) {
            return;
        }
        System.out.print(treeNode.value + " --- ");
        preOrderTraversalWithRecursive(treeNode.left);
        preOrderTraversalWithRecursive(treeNode.right);
    }


    /*
     * 先序非递归方法  顺序 中 左 右
     * */
    public static void preOrderTraversalWithNoRecursive(TreeNode treeNode) {
        Stack<TreeNode> stack = new Stack<>();
        while (treeNode != null || !stack.empty()) {
            while (treeNode != null) {
                System.out.print(treeNode.value + "  ");
                stack.push(treeNode);
                treeNode = treeNode.left;
            }

            if (!stack.isEmpty()) {
                treeNode = stack.pop();
                treeNode = treeNode.right;
            }
        }
    }

    /*
     * 中序遍历递归   顺序:  左  中  右
     * */
    public static void midOrderTraversalWithRecursive(TreeNode treeNode) {
        if (treeNode == null) {
            return;
        }
        midOrderTraversalWithRecursive(treeNode.left);
        System.out.print(treeNode.value + " ");
        midOrderTraversalWithRecursive(treeNode.right);
    }

    /*
     * 中序遍历,非递归方法   顺序:  左  中  右
     * */
    public static void midOrderTraversalWithNoRecursive(TreeNode treeNode) {
        Stack<TreeNode> stack = new Stack();
        while (treeNode != null || !stack.isEmpty()) {
            while (treeNode != null) {
                stack.push(treeNode);
                treeNode = treeNode.left;
            }

            if (!stack.isEmpty()) {
                treeNode = stack.pop();
                System.out.printf(treeNode.value + " ");
                treeNode = treeNode.right;
            }
        }
    }

    /*
     * 后序遍历 递归
     * 顺序  左 右 中
     * */
    public static void PostOrderTraversalWithRecursive(TreeNode treeNode) {
        if (treeNode == null) {
            return;
        }
        PostOrderTraversalWithRecursive(treeNode.left);
        PostOrderTraversalWithRecursive(treeNode.right);
        System.out.printf(treeNode.value + " ");
    }


    /*
     * 后序遍历 非递归
     * 顺序  左 右 中
     * 思路: 后序遍历和前面的还不太一样,需要确定左右子树都已经遍历完成,才可以输出根子树
     * */
    public static void PostOrderTraversalWithNoRecursive(TreeNode treeNode) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode lastTreeNode = treeNode;
        while (treeNode != null || !stack.isEmpty()) {
            while (treeNode != null) {
                stack.push(treeNode);
                treeNode = treeNode.left;
            }
            treeNode = stack.peek();
            if (treeNode.right == null || treeNode.right == lastTreeNode) {
                System.out.print(treeNode.value + " ");
                lastTreeNode = stack.pop();
            } else {
                treeNode = treeNode.right;
            }
        }
    }

    static class TreeNode {
        int value;
        TreeNode left;
        TreeNode right;

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

        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }

        public TreeNode getLeft() {
            return left;
        }

        public void setLeft(TreeNode left) {
            this.left = left;
        }

        public TreeNode getRight() {
            return right;
        }

        public void setRight(TreeNode right) {
            this.right = right;
        }
    }
}

相关文章

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

  • 二叉树三种遍历Swift代码实现

    二叉树的三种遍历 二叉树 前序遍历 中序遍历 后序遍历 另外 不得不说,得到二叉树的前序遍历和中序遍历的结果或者后...

  • 二叉树的遍历

    二叉树的遍历 二叉树遍历 分为前序遍历、中序遍历和后序遍历。 前序遍历 (DLR) 先访问根节点,然后前序遍历左子...

  • 前端二叉树

    (一)构造二叉树 (二)中序遍历 (三)前序遍历 前序遍历可以复制二叉树,效率比重新构造二叉树高 (四)后序遍历 ...

  • 数据结构:树的实现和遍历(c++)

    (一)二叉树的遍历——递归实现 二叉树常见的遍历方式分为前序遍历、中序遍历和后序遍历。 1 前序遍历 前序遍历也叫...

  • leetcode 144 145 94

    二叉树遍历 前序遍历 中序遍历 后序遍历

网友评论

      本文标题:二叉树遍历

      本文链接:https://www.haomeiwen.com/subject/ifhebctx.html