Java下实现二叉树的先序遍历栈方式

今天看了许久,前序遍历的非递归实现方式。无奈小弟才疏学浅,有些愚笨,照着源码看了很久才有些思路,大神就是大神,如此简洁的几行代码就能实现前序遍历,真是佩服,先贴代码。

Java下实现二叉树的先序遍历栈方式_第1张图片

  // 前序遍历,栈方式
    public void preLoopStack(TreeNode root)
    {
        if (root == null)
            return;
        Stack s = new Stack<>();
        while (root != null || !s.isEmpty())
        {
            while (root != null)
            {
                System.out.print(root.val);
                s.push(root);// 先访问再入栈
                root = root.leftChild;// 一直访问左子树
            }
            root = s.pop();
            root = root.rightChild;// 如果是null,出栈并处理右子树
        }
    }

下面是小弟的一些愚见:

前序遍历的顺序:根左右。

使用递归来实现前序遍历说白了,他的底层也是通过栈的方式来实现的。

这个代码的大体思路是:

1、定义一个stack栈【先进后出】,保存遍历时的回溯结点。

2、大循环,以根结点为循环的初始入口,当Stack不为空【stack为空的话,就没有回溯的可能了,不知道是不是这个意思】或者每一次大循环得到的root不为空时【为空的话,就说明已经把右子树都遍历完了,整个遍历就完成了诶】。

3、小循环,即实现先输出根本身,再输出左子树的结点【你看,把 System.out.print(root.val);放在小循环的第一行就是这个原因诶】。 s.push(root);// 先访问再入栈,这是为了方便访问完左子树后进行回溯,从而访问右子树。

4、 root = s.pop();开始回溯了,注意哟,这里就用到了栈的“先进后出”的特性。访问完左子树后【当root的左子树为空时】,立即回溯访问该root的上一节点【即根结点】。然后root = root.rightChild,访问该根结点的右子树。

5、接下来,重复3,将4的右子树当成根结点,访问,先将他输出【根左右嘛】,然后将他压入stack栈中,方便将来回溯访问他的右子树,然后访问他的左子树。。。。。如此循环。


说白了,就是把每一个结点都当成一个根结点,按照前序遍历的顺序进行输出打印。

不知道小弟分析的是否有道理,望大家不吝赐教。






你可能感兴趣的:(java学习小笔记)