Skip to content
本页目录

0145-二叉树的后续遍历

https://leetcode.cn/problems/binary-tree-postorder-traversal

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

示例:

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

输出: [3,2,1]

进阶:递归算法很简单,你可以通过迭代算法完成吗?

思路:递归dfs

参考代码

csharp
public class Solution {
	List<int> list;
	private void dfs(TreeNode root){
		if(root == null){
			return;
		}
		dfs(root.left);
		dfs(root.right);
		list.Add(root.val);
	}
    public IList<int> PostorderTraversal(TreeNode root) {
    	list = new List<int>();
    	dfs(root);
    	return list;
    }
}

思路2: 迭代(栈)

参考代码

csharp
public class Solution{
	public IList<int> PostorderTraversal(TreeNode root){
		List<int> list = new List<int>();
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode node = root;

		TreeNode prev ;

		while(node != null || stack.Count > 0){
			while(node != null){
				stack.Push(node);
				node = node.left;
			}
			node = stack.Pop();
			//后续节点遍历不能直接加入
			//需要判断没有后续节点了(node.right == null) 或者节点已经处理过了 (node.right == prev)
			if(node.right == null || node.right == prev){
    			list.Add(node.val);	
    			prev = node;
    			node = null; //结束循环
    		}
    		else{
    			stack.Push(node);
    			node = node.right;
    		}
		}

		return list;
	}
}

Released under the MIT License.