跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!
代码随想录
LeetCode:144. 二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,2,3]
解释:
示例 2:
输入:root = [1,2,3,4,5,null,8,null,null,6,7,9]
输出:[1,2,4,5,6,7,3,8,9]
解释:
示例 3:
输入:root = []
输出:[]
示例 4:
输入:root = [1]
输出:[1]
前序遍历递归法
- 确定入参,返回值
- 确定终止条件
- 确定单层递归逻辑
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
treversal(root, res);
return res;
}
private void treversal(TreeNode root, List<Integer> res){
if(root == null){
return;
}
res.add(root.val);
treversal(root.left, res);
treversal(root.right, res);
}
前序遍历迭代法(非递归法)
通过栈来实现非递归遍历,因为是放入栈,所以需要先放right
然后再放left
,,先进后出;注意判空
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
if(node != null){
res.add(node.val);
}else{
continue;
}
stack.push(node.right);
stack.push(node.left);
}
return res;
}
也可以这样,只是判空逻辑不同
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.isEmpty()) {
TreeNode node = stack.pop();
result.add(node.val);
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
return result;
}