二叉树oj ---->先序 or 前序遍历(非递归实现)

Posted ohana!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树oj ---->先序 or 前序遍历(非递归实现)相关的知识,希望对你有一定的参考价值。

题目内容:

 解题思路:

在之前刚学二叉树的时候,接触的是递归,就是用递归的方法进行的先序遍历,它的时间复杂度和空间复杂度都比较高,现在用非递归的方法,首先想到的就是用循环,至于还用什么后面分析就会知道

  • 根据二叉树的先序遍历的要求 (根节点    左子树   右子树);发现,它的关键在于如何处理左子树和右子树,如果用循环去遍历左子树,问题就在于那右子树就没办法遍历到(首先说,先遍历再后遍历,这种方法明显是不行的,举个很简单的例子,根节点的左子树一律没有右子树,当然可以,那也得保证右子树同样是没有左子树,既然,只适合于这种情况,其余的情况的都是反例,所以,不可行,于是,我们要考虑的是,在遍历左子树的同时,右子树也不能落下,因此,我们要采用一个容器,去放这个右子树,现在的难题又是选择哪个容器,再根据我们思路去考虑,左子树是一直往下走的,右子树的元素肯定是前面的在最前面或者最下面,我们遍历的条件又是左边完了,立马就要进行这个结点的右子树,所以,必须具备,后进先出的功能,所以,我们选择栈)
  • 根据上面的描述,如果这个结点有右子树,我们就将其入栈,直到左子树遍历完成,此时,我们从栈当中取出元素就是这个结点的右子树

 解题代码:

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();

        //若树为空树
        if(root == null){
            return list;
        }

        //树不为空树
        Stack<TreeNode> s = new Stack<>();
        TreeNode cur = root;
        while(!s.empty() || cur != null){
            while(cur != null){

                list.add(cur.val);
                if(cur.right != null){
                    s.push(cur.right);
                }

                cur = cur.left;
            }            
            
            if(!s.empty()){
                cur = s.pop();
            }
        }
        return list;
    }
}

以上是关于二叉树oj ---->先序 or 前序遍历(非递归实现)的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的非递归遍历怎么写?

二叉树前序遍历递归和非递归解法

二叉树前序中序和后序遍历的非递归实现

二叉树几种遍历算法的非递归实现

java 二叉树的前序遍历(非递归)

二叉树前序后序和后序遍历(非递归实现)