原题链接:在二叉树中找到两个节点的最近公共祖先_牛客题霸_牛客网
描述:
给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
数据范围:1 \le n \le 10001≤n≤1000,树上每个节点的val满足 0<val \le 1000<val≤100
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
注:本题保证二叉树中每个节点的val值均不相同。
如当输入[3,5,1,6,2,0,8,#,#,7,4],5,1时,二叉树{3,5,1,6,2,0,8,#,#,7,4}如下图所示:
所以节点值为5和节点值为1的节点的最近公共祖先节点的节点值为3,所以对应的输出为3。
解题思路:
动态规划的思路,
1.判断当前节点是否时o1,o2节点,如果时则返回当前节点。
2.判断o1,o2值是否在左侧节点中,如果在则返回左侧节点。
3.右侧同2
4.如果左右侧节点都不为空,则说明当前节点就是最近公共祖先,返回。
5.如果只是左侧节点不为空,那么返回左侧节点(这个左侧节点就是o1或者o2节点)
6.右侧节点逻辑同5
7.左右都为空则返回null。说明当前节点不包含o1,o2节点
代码:
public int lowestCommonAncestor(TreeNode root, int o1, int o2) {
// write code here
TreeNode node = findNode(root, o1, o2);
return node.val;
}
public TreeNode findNode(TreeNode root, int o1, int o2) {
if (root.val == o1 || root.val == o2) {
return root;
}
TreeNode node1 = null;
TreeNode node2 = null;
if (root.left != null) {
node1 = findNode(root.left, o1, o2);
}
if (root.right != null) {
node2 = findNode(root.right, o1, o2);
}
if (node1 != null && node2 != null) {
return root;
}
if (node1 != null) {
return node1;
}
if (node2 != null) {
return node2;
}
return null;
}