145. 二叉树的后序遍历(迭代实现)

/**
 * 145. 二叉树的后序遍历
 * @author wsq
 * @date 2020/09/29
	 给定一个二叉树,返回它的 后序 遍历。
	
	示例:
	输入: [1,null,2,3]  
	   1
	    \
	     2
	    /
	   3 
	
	输出: [3,2,1]

	进阶: 递归算法很简单,你可以通过迭代算法完成吗?
	
	链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal
 */
package com.wsq.tree;

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;

public class PostorderTraversal {
	/**
	 *	使用栈结构模拟递归,关键点是怎么判断右节点已经被访问过了
	 *	因此增加了一个prev指针,指向上一个被访问的节点,从root重新访问右节点时,就可以判断出,右节点是否已经被访问过了
	 * @param root
	 * @return
	 */
    public List<Integer> postorderTraversal(TreeNode root) {
    	List<Integer> ansList = new ArrayList<>();
    	if(root == null) {
    		return ansList;
    	}
    	
    	Deque<TreeNode> stack = new LinkedList<>();
    	
    	TreeNode prev = null;
    	while(root != null || !stack.isEmpty()) {
    		while(root != null) {
    			stack.push(root);
    			root = root.left;
    		}
    		root = stack.pop();
    		if(root.right == null || root.right == prev) {
    			ansList.add(root.val);
    			prev = root;
    			root = null;
    		}else {
    			stack.push(root);
    			root = root.right;
    		}
    	}
    	return ansList;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值