Leetcode 刷题日记
2021.2.19
题目链接:
https://leetcode-cn.com/problems/leaf-similar-trees/
问题描述:
解答1:
非递归的深度优先
代码:
class Solution {
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
LinkedList<TreeNode> leaves1= leaves(root1);
LinkedList<TreeNode> leaves2= leaves(root2);
if(leaves1.size() != leaves2.size()) return false;
while(!leaves1.isEmpty()){
if(leaves1.pop().val != leaves2.pop().val) return false;
}
return true;
}
public LinkedList<TreeNode> leaves(TreeNode root){
LinkedList<TreeNode> result= new LinkedList<>();
LinkedList<TreeNode> stack = new LinkedList<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
if(node.left == null && node.right == null) result.push(node);
else{
if(node.right != null) stack.push(node.right);
if(node.left != null) stack.push(node.left);
}
}
return result;
}
}
分析:
时间复杂度:O(n1+n2)
空间复杂度:O(n1+n2)
运行结果:
评注:
这是笔者在之前版本的非递归dfs的基础上进行的优化。之前版本的dfs是具有“破坏性质”的实现,并且运行效率较低。
解答2:
递归的深度优先
代码:
class Solution {
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
LinkedList<TreeNode> leaves1 = new LinkedList<>();
leaves(root1,leaves1);
LinkedList<TreeNode> leaves2 = new LinkedList<>();
leaves(root2,leaves2);
if(leaves1.size() != leaves2.size()) return false;
while(!leaves1.isEmpty()){
if(leaves1.pop().val != leaves2.pop().val) return false;
}
return true;
}
public void leaves(TreeNode root,LinkedList<TreeNode> result){
if(root.left == null && root.right == null) result.push(root);
else{
if(root.left != null) leaves(root.left,result);
if(root.right != null) leaves(root.right,result);
}
}
}
分析:
时间复杂度:O(n1+n2)
空间复杂度:O(n1+n2)
运行结果:
评注:
笔者在实现递归时并没有使用return语句。实际上,是否使用return并不影响程序的运行。return的意义是获取上一次递归的结果,但是这里的递归函数,其结果被记录在引用数据类型中,所以没有必要添加return语句。