2024.4.3
题目来源
我的题解
方法一 深度优先搜索
同时对二叉树 original 与 cloned 进行深度优先搜索,如果 original当前搜索的节点的引用等于 target 节点的引用,那么对应地返回 cloned 当前搜索的节点,否则继续对各自的左右节点同时进行搜索。
时间复杂度:O(n)
空间复杂度:O(n)
public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
if(original==null)
return null;
if(target.val==cloned.val)
return cloned;
TreeNode left=getTargetCopy(original.left,cloned.left,target);
TreeNode right=getTargetCopy(original.right,cloned.right,target);
return left==null?right:left;
}
方法二 广度优先遍历
使用队列同时对二叉树 original和 cloned 进行广度优先搜索,初始时分别将根节点 original 和 cloned 压入队列 q1和 q2 。假设当前搜索的节点分别为 node1与 node2,将 node1与 node2分别弹出队列,如果 node1节点的引用等于 target 节点的引用,那么返回 node2,否则将分别将 node1和 node2 的非空子节点压入队列 q1 和 q2,继续搜索过程。
时间复杂度:O(n)
空间复杂度:O(n)
public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
if(original==null)
return null;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(cloned);
while(!queue.isEmpty()){
int sz=queue.size();
for(int i=0;i<sz;i++){
TreeNode t=queue.poll();
if(target.val==t.val)
return t;
if(t.left!=null)
queue.offer(t.left);
if(t.right!=null)
queue.offer(t.right);
}
}
return null;//不可能的
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~