【主要考察点】:树
解题方法
1. 递归
树的前、中、后序遍历,使用递归的方式非常简单。
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
dfs(ans,root);
return ans;
}
public void dfs(List<Integer> ans, TreeNode node){
if(node == null){
return;
}
dfs(ans, node.left);
ans.add(node.val);
dfs(ans, node.right);
}
}
2. 迭代
所有递归的方式,都可以用迭代的方式来替换,本题的进阶难度也要求我们使用迭代来完成,递归方法实际上也是利用程序栈来实现,因此我们完全可以自己构建一个栈来进行模拟。
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while(!stack.isEmpty() || root != null){
// 左子树优先压栈
while(root != null){
stack.push(root);
root = root.left;
}
// 当左子树没有时,则记录当前值,然后转到右子树的分支上,继续从左子树开始优先压栈。
root = stack.pop();
ans.add(root.val);
root = root.right;
}
return ans;
}
}