题目:
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路:
对于二叉树的先序遍历,中左右的遍历方式用递归的方式编写出来太简单了,然后本题目的进阶要求是采用迭代的方式完成,因此我们思考一下递归的时候是如何处理的:先遍历中间结点,然后递归该结点的左节点,最后递归右节点,可以发现右节点在左节点遍历完成之前是完全处于“阻塞”状态的。因此,为了模拟这种“阻塞”状态的一种结构,我们选择采用“栈”来进行迭代的实现。
代码:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null)
return result;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.empty()) {
TreeNode temp = stack.pop();
result.add(temp.val);
// 先压入右节点
if (temp.right != null)
stack.add(temp.right);
// 再压入左节点
if (temp.left != null)
stack.add(temp.left);
}
return result;
}
}