美文网首页
1.二叉树的前中后序遍历的递归及非递归实现

1.二叉树的前中后序遍历的递归及非递归实现

作者: 山行牧野 | 来源:发表于2019-07-21 14:53 被阅读0次

首先写定义Node类(Node.java)

public class Node {

    public int value;
    public Node left;
    public Node right;
    public Node(int data)
    {
        this.value = data;
    }
}

二叉树遍历的递归写法
1.前序遍历

    public void preOrder(Node head)
    {
        if(head == null)
        {
            return;
        }
        System.out.print(head.value + " ");
        preOrder(head.left);
        preOrder(head.right);
    }

2.中序遍历

public void inOrder(Node head)
    {
        if(head == null)
        {
            return;
        }
        inOrder(head.left);
        System.out.print(head.value + " ");
        inOrder(head.right);
    }

3.后序遍历

public void posOrder(Node head)
    {
        if(head == null)
        {
            return;
        }
        posOrder(head.left);
        posOrder(head.right);
        System.out.print(head.value + " ");
    }

以上过程比较简单,不再赘述
重点是二叉树遍历的非递归写法(参考左程云的那本书):
1.前序遍历

    public void preOrderUn(Node head)
    {
        System.out.println("pre-order:");
        if(head != null)
        {
            Stack<Node> stack = new Stack<>();
            stack.push(head);
            while(!stack.isEmpty())
            {
                Node cur = stack.pop();
                System.out.print(cur.value+" ");
                if(cur.right != null)
                    stack.push(cur.right);
                if(cur.right != null)
                    stack.push(cur.right);
            }
        }
    }

借用栈结构,先将头结点压入栈中,然后在栈非空的时候,弹出栈顶元素并打印,如果该元素有孩子,就先将右孩子压入,再将左孩子压入,如此循环往复即可
2.中序遍历

public void inOrderUn(Node head)
    {
        if(head != null)
        {
            Stack<Node> stack = new Stack<>();
            while(head != null || !stack.isEmpty())
            {
                if(head != null)
                {
                    stack.push(head);
                    head = head.left;
                }else {
                    head = stack.pop();
                    System.out.print(head.value + " ");
                    head = head.right;
                }
            }
        }
    }

还是利用了栈结构,因为递归就是系统在帮我们压栈和弹栈。先一直将该节点的左孩子压入栈中,直到该节点为空,然后弹出栈顶元素并打印,将该节点的右孩子(如果不为空的话)压入,如此循环
3.后序遍历

public void posOrderUn(Node head)
    {
        if(head != null)
        {
            Stack<Node> s1 = new Stack<>();
            Stack<Node> s2 = new Stack<>();
            s1.push(head);
            while(! s1.isEmpty())
            {
                head = s1.pop();
                s2.push(head);
                if(head.left != null)
                    s1.push(head.left);
                if(head.right != null)
                    s1.push(head.right);
            }
            while(! s2.isEmpty())
            {
                System.out.print(s2.pop().value + " ");
            }
        }
    }

利用了两个栈,s1的逻辑和前序遍历栈的逻辑差不多,只是先压入左孩子,再压入右孩子,s1每弹出一个元素,s2就将该元素压入栈中,最后一次弹出s2中的元素即可。

相关文章

  • 左神算法笔记——Morris遍历

    基本问题——实现二叉树的前序、中序、后序遍历 (递归、非递归,mirros方法) 递归 递归方式下的前中后遍历 非...

  • 数据结构-树的遍历

    1. 先序遍历 递归实现 非递归实现 2. 中序遍历 递归实现 非递归实现 3. 后序遍历 递归实现 非递归实现 ...

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • 各种二叉树遍历

    C++实现,二叉树的递归、非递归版本的前序、中序、后序遍历。

  • 二叉树

    来源 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现 二叉树的实现及先序、...

  • 二叉树前、中、后序遍历、层次遍历

    1、前序遍历 非递归:利用Stack实现 递归 2、中序遍历 非递归:利用Stack实现 递归: 3、后序遍历 非...

  • 二叉树的操作

    /*主要内容:1、实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式*/ 实现二叉树的先序、中序、后序遍历...

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • 二叉树的各类遍历方法

    二叉树的遍历主要有四种:前序、中序、后序、层序。 遍历的实现方式主要是:递归和非递归。递归遍历的实现非常容易,非递...

网友评论

      本文标题:1.二叉树的前中后序遍历的递归及非递归实现

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