参考代码:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
res.add(root.val);
stack.add(root);
root = root.left;
}
root = stack.pop().right;
}
return res;
}
}
运用的迭代解法。
创建一个序列和一个栈,当所在节点不为空或者栈不为空时进入循环,
如果当前节点不为空,则将其值添加至序列中,即根节点在最前面,将根节点放入栈中,将左孩子赋值给根节点;
如果左孩子也不为空则继续进行循环,直至找到最左端,中途经过的结点已在每一次的循环中写入序列,到了最左端后开始返回到上一个节点,并访问上一节点的右孩子并写入序列中,访问上一节点则需用到栈的后进先出原则,越靠后的结点越后进越先出,所以可通过root = stack.pop().right;来进行上述操作;
一个节点一个节点的往上一个节点返回,并将结点的右孩子加入序列中,直至到栈中最先进入的根节点出栈,以同样的方法将根节点的右子树依次加入序列中;
最终返回res,即为先根再左后右的前序遍历序列。