思路
利用栈的特性存储遍历过的节,先输出,再入栈,假如左子树为空,则输出,开始遍历右子树,直到树全部遍历或者栈为空
- 输出根节点
- 入栈
- 判断左子树是否为空
3.1 非空: 操作(1)
3.2 空值: 出栈,遍历右子树,继续操作(1)
整体操作流程
整体动图
详情
遍历左子树,输出根节点
入栈
左子树为空-出栈
遍历右子树
遍历结束
相关代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
result.addAll(noRecursive(root));
return result;
}
// 根左右
public List<Integer> noRecursive(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
while(root!=null||!stack.empty()){
// 遍历左子树
while(root!=null){
// 根
result.add(root.val);
stack.push(root);
root = root.left;
}
// 设置为左子树的右子树
if(!stack.isEmpty()){
root = stack.pop();
root = root.right;
}
}
return result;
}
// 递归
public List<Integer> recursive(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root==null){
return result;
}
result.add(root.val);
result.addAll(recursive(root.left));
result.addAll(recursive(root.right));
return result;
}
}