2024.2.11
题目来源
我的题解
方法一 递归方式
按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,可以直接用递归函数来模拟这一过程
时间复杂度:O(n)
空间复杂度:O(n)
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
preOrder(root,res);
return res;
}
public void preOrder(TreeNode root,List<Integer> res){
if(root==null)
return;
res.add(root.val);
preOrder(root.left,res);
preOrder(root.right,res);
}
方法二 非递归方式
自己定义一个栈代替递归栈
时间复杂度:O(n)
空间复杂度:O(n)
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
if(root==null)
return res;
LinkedList<TreeNode> stack=new LinkedList<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode t=stack.pop();
res.add(t.val);
//注意这里不在是先左再右,而是先右再左,因为后续需要从栈中取,存入是先右再左,则取出时是先左再右
if(t.right!=null)
stack.push(t.right);
if(t.left!=null)
stack.push(t.left);
}
return res;
}
方法三 Morris 遍历
这个方法可以使得空间复杂度在常量级别。具体实现参考官方题解。
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~