给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal
递归
class Solution {
List<Integer> list1 = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if(root == null) return list1;
return preorder(root);
}
public List<Integer> preorder(TreeNode root){
list1.add(root.val);
if(root.left != null){
preorder(root.left);
}
if(root.right != null){
preorder(root.right);
}
return list1;
}
}
迭代 LinkedList
class Solution {
List<Integer> list1 = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if(root == null) return list1;
return preorder(root);
}
public List<Integer> preorder(TreeNode root){
LinkedList<TreeNode> q1 = new LinkedList<>(); //此处的引用是LinkedList
q1.add(root);
while(!q1.isEmpty()){
TreeNode n = q1.pollLast(); //方法是LinkList中的方法
//若是Queue的引用 使用poll 是先进先出 在第二层两个点 先会执行另一个点
//而不是执行一个点的子点
list1.add(n.val);
if(n.right != null){ //保证先执行左子树的点
q1.add(n.right);
}
if(n.left != null){
q1.add(n.left);
}
}
return list1;
}
}
迭代 使用stack
class Solution {
List<Integer> list1 = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if(root == null) return list1;
return preorder(root);
}
public List<Integer> preorder(TreeNode root){
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode n = stack.pop();
if(n == null) continue;
list1.add(n.val);
if(n.right != null){ //保证先遍历左子树
stack.push(n.right);
}
if(n.left != null){
stack.push(n.left);
}
}
return list1;
}
}