LeetCode(剑指 Offer)- 68 - I. 二叉搜索树的最近公共祖先

简介: LeetCode(剑指 Offer)- 68 - I. 二叉搜索树的最近公共祖先

题目链接:点击打开链接

题目大意:

解题思路:

相关企业

  • 字节跳动
  • Facebook
  • 亚马逊(Amazon)
  • 谷歌(Google)
  • 微软(Microsoft)
  • 腾讯(Tenent)
  • 快手
  • 小米集团
  • 苹果(Apple)
  • 领英(LinkedIn)

AC 代码

  • Java
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/// 解决方案(1)classSolution {
Stack<TreeNode>pStack=newStack<>(), qStack=newStack<>();
Map<TreeNode, Integer>pMap=newHashMap<>(), qMap=newHashMap<>();
publicTreeNodelowestCommonAncestor(TreeNoderoot, TreeNodep, TreeNodeq) {
dfs(root, p.val, pStack, pMap, 0);
dfs(root, q.val, qStack, qMap, 0);
TreeNoderes=common();
returnres;
    }
TreeNodecommon() {
TreeNoderes;
while (!pStack.isEmpty() &&!qStack.isEmpty()) {
TreeNodepe=pStack.peek();
TreeNodeqe=qStack.peek();
if (pe.val==qe.val) {
res=pStack.peek();
pStack.pop();
qStack.pop();
returnres;
            }
if (pMap.get(pe) >qMap.get(qe)) {
pStack.pop();
            } elseif (pMap.get(pe) <qMap.get(qe)) {
qStack.pop();
            } else {
pStack.pop();
qStack.pop();
            }
        }
returnnull;
    }
voiddfs(TreeNodenode, intval, Stack<TreeNode>stack, Map<TreeNode, Integer>map, intl) {
if (node==null) {
return;
        }
if (node.val==val) {
stack.push(node);
map.put(node, l);
        } elseif (node.val>val) {
stack.push(node);
map.put(node, l);
dfs(node.left, val, stack, map, l+1);
        } else {
stack.push(node);
map.put(node, l);
dfs(node.right, val, stack, map, l+1);
        }
    }
}
// 解决方案(2)classSolution {
publicTreeNodelowestCommonAncestor(TreeNoderoot, TreeNodep, TreeNodeq) {
if(p.val>q.val) { // 保证 p.val < q.valTreeNodetmp=p;
p=q;
q=tmp;
        }
while(root!=null) {
if(root.val<p.val) // p,q 都在 root 的右子树中root=root.right; // 遍历至右子节点elseif(root.val>q.val) // p,q 都在 root 的左子树中root=root.left; // 遍历至左子节点elsebreak;
        }
returnroot;
    }
}
// 解决方案(3)classSolution {
publicTreeNodelowestCommonAncestor(TreeNoderoot, TreeNodep, TreeNodeq) {
if(root.val<p.val&&root.val<q.val)
returnlowestCommonAncestor(root.right, p, q);
if(root.val>p.val&&root.val>q.val)
returnlowestCommonAncestor(root.left, p, q);
returnroot;
    }
}
  • C++
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/// 解决方案(1)classSolution {
public:
TreeNode*lowestCommonAncestor(TreeNode*root, TreeNode*p, TreeNode*q) {
if(p->val>q->val)
swap(p, q);
while(root!=nullptr) {
if(root->val<p->val) // p,q 都在 root 的右子树中root=root->right; // 遍历至右子节点elseif(root->val>q->val) // p,q 都在 root 的左子树中root=root->left; // 遍历至左子节点elsebreak;
        }
returnroot;
    }
};
// 解决方案(2)classSolution {
public:
TreeNode*lowestCommonAncestor(TreeNode*root, TreeNode*p, TreeNode*q) {
if(root->val<p->val&&root->val<q->val)
returnlowestCommonAncestor(root->right, p, q);
if(root->val>p->val&&root->val>q->val)
returnlowestCommonAncestor(root->left, p, q);
returnroot;
    }
};
目录
相关文章
|
4月前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
247 14
|
5月前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
108 4
|
11月前
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作
59 1
|
11月前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
71 1
|
11月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
97 0
|
11月前
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树
56 0
|
11月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
88 0
|
11月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
85 0
|
11月前
【LeetCode 42】501.二叉搜索树中的众数
【LeetCode 42】501.二叉搜索树中的众数
59 0
|
11月前
【LeetCode 41】530.二叉搜索树的最小绝对差
【LeetCode 41】530.二叉搜索树的最小绝对差
63 0

热门文章

最新文章