leetcode 145. Binary Tree Postorder Traversal

本文介绍了一种不使用递归实现二叉树后根遍历的方法,通过栈来跟踪节点的访问状态,并提供了一个简洁的迭代解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a binary tree, return the postorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

后根遍历指:首先遍历左子树,然后遍历右子树,最后遍历访问根结点。

不许用递归了,那我就用的栈。把 某个结点的左右子树是否访问 记录下来。

public List<Integer> postorderTraversal(TreeNode root) {
	List<Integer> list=new ArrayList<Integer>();
	if(root==null){
		return list;
	}
	Stack<TreeNodeUsed> stack=new Stack<>();
	stack.push(new TreeNodeUsed(root));
	while(!stack.isEmpty()){
		TreeNodeUsed nodeUsed=stack.pop();
		if(nodeUsed.leftUsed==true&&nodeUsed.rightUsed==true){
			list.add(nodeUsed.node.val);
		}
		else{
			nodeUsed.rightUsed=true;
			nodeUsed.leftUsed=true;
			stack.push(nodeUsed);
			if(nodeUsed.node.right!=null){
				stack.push(new TreeNodeUsed(nodeUsed.node.right));
			}
			if(nodeUsed.node.left!=null){
				stack.push(new TreeNodeUsed(nodeUsed.node.left));
			}
		}
	}
	return list;
}

class TreeNodeUsed{
	TreeNode node;
	boolean leftUsed;
	boolean rightUsed;
	public TreeNodeUsed(TreeNode n){
		node=n;
		leftUsed=false;
		rightUsed=false;
	}
}
有大神也用的栈,但是方法比我简洁得多:
public List<Integer> postorderTraversal(TreeNode root) {
	LinkedList<Integer> ans = new LinkedList<>();
	Stack<TreeNode> stack = new Stack<>();
	if (root == null) return ans;
	
	stack.push(root);
	while (!stack.isEmpty()) {
		TreeNode cur = stack.pop();
		ans.addFirst(cur.val);
		if (cur.left != null) {
			stack.push(cur.left);
		}
		if (cur.right != null) {
			stack.push(cur.right);
		} 
	}
	return ans;
}
精髓在于"add first",把数字添加到链表的最前部。这样先被pop出来的node值反而会写在结果链表的后面。我们只要使栈pop出来的顺序是 根->右->左,这样出来的结果链表的顺序就自然的反向,成为 左->右->根。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值