【
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。
说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
】
先分别二叉树遍历找到 p和q两个节点,同时临时数组记录他们遍历结果和长度。
然后短的那个临时数组向上搜索,遇到另一个数组相同的节点,那么此节点便是最近公共祖先节点。
void preorderp(struct TreeNode* root, struct TreeNode* note, struct TreeNode *temp, int *fline, int *finish, int new){
if((root == NULL) ||(*finish == 1)) return;
temp[new++] = *root;
if(root->val == note->val) {
*finish = 1;
*fline = new - 1;
return;
}
preorderp(root->left, note, temp, fline, finish, new);
preorderp(root->right, note, temp, fline, finish, new);
}
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
struct TreeNode tempp[10240] = {0};
struct TreeNode tempq[10240] = {0};
int pline = 0;
int qline = 0;
int i;
int line;
struct TreeNode* ret = NULL;
int finish = 0;
if(root == NULL) return 0;
tempp[0] = *root;
tempq[0] = *root;
ret = root;
preorderp(root, p, tempp, &pline, &finish, 0);
finish = 0;
preorderp(root, q, tempq, &qline, &finish, 0);
if(pline < qline) {
line = pline;
} else {
line = qline;
}
for(i = line; i >= 0; i--) {
if(tempp[i].val == tempq[i].val) {
ret = &(tempp[i]);
break;
}
}
return ret;
}