LeetCode第144题二叉树的前序遍历

144. 二叉树的前序遍历

题目:

给定一个二叉树,返回它的 前序 遍历。

示例:

输入: [1,null,2,3]
1

2
/
3

输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

使用递归实现树的遍历很简单,这里就不讲了。我主要讲一下非递归的

非递归实现栈的遍历主要有两种方式:

利用栈(其实也是递归的思路),和递归的代码差不都,在一个节点第一次进栈的时候输出这个节点

利用栈实现:
public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        if(root == null) return ans;
        Stack<TreeNode> st = new Stack<>();
        st.push(root);
        while(!st.isEmpty()) {
            root = st.pop();
            ans.add(root.val);
            if(root.right != null) st.push(root.right);
            if(root.left != null) st.push(root.left);
        }
        return ans;
    }

Morris遍历的步骤:

1.如果当前节点没有左节点,那么直接走当前节点的右节点

2.如果当前节点有左节点,则遍历当前节点左节点的右节点

  • 如果当前节点左节点的右节点为null,则将当前节点挂在右节点上
  • 如果当前节点左节点的右节点等于当前节点,则将右节点重新置为null,并将当前节点更新为当前节点的右节点
Morris遍历:
public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> ans = new ArrayList<>();
        TreeNode cur;
        while(root != null) {
            cur = root.left;
            if(cur != null){
                while(cur.right != null && cur.right != root) {
                    cur = cur.right;
                }
                if(cur.right == null) {
                    ans.add(root.val);
                    cur.right = root;
                    root = root.left;
                    continue;
                }else {
                    cur.right = null;
                }
            }else
            	ans.add(root.val);
            root = root.right;
        }
        return ans;
    }
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页