Leetcode144| 二叉树的前序遍历非递归 自己压栈

 虽然我们这是非递归实现,但是我还是要讲一下递归序

递归序号就是每个节点我们实际是到达三次的

比如这题是先序就是:头左右

我们不管什么序,先来遍历吧

112333221先序是打第一次出现的时候所以是123

我们如何通过自己压栈实现呢

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode head) {
        List<Integer> list=new ArrayList<>();
        if(head!=null)//头一直在变变成子树的头
            Stack<TreeNode> stack=new Stack<TreeNode>();
            stack.add(head);//栈里压入新头
            while(!stack.isEmpty()){
                 head=stack.pop();//栈顶pop出来
               // System.out.printf("%d\n",head.val);
                list.add(head.val);
                if(head.right!=null){
                    stack.push(head.right);//右孩子入栈
                }
                if(head.left!=null){
                    stack.push(head.left);//左孩子入栈
                }
            }
        }
        return list;
    }
}

这样一来头节点都是进去就迅速被弹出,顺着进去又弹出的头,把他的右孩子压进去,再压它的左孩子,此时栈内有他的左右孩子栈不空所以,弹出它的左孩子,又把左孩子的右左孩子压进去

如图

 ①压栈,栈不空开始弹出①,把它右孩子②压进去,栈不空弹出②,把它左孩子压进去③最后弹出③

得123

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值