从root
节点开始向下移动,如果找到任何一个节点,它的直接子节点是p
或q
,那么这个节点就是LCA。 如果p
或q
是节点的值,则返回该节点。否则,当p
或q
之一是另一个的直接子节点时,将无法成功。
否则,如果在其右(或左)子树中找到具有p
的节点和在其左(或右)子树中找到具有q
的节点,则该节点是LCA。
修复后的代码如下:
treeNodePtr findLCA(treeNodePtr root, treeNodePtr p, treeNodePtr q) {
if(!root) {
return NULL;
}
if(root==p || root==q) {
return root;
} else {
treeNodePtr l=findLCA(root->left , p , q);
treeNodePtr r=findLCA(root->right , p, q);
if(l && r) {
return root;
}
else if(l) {
return l;
} else {
return r;
}
}
}
下面的代码在其中一个元素是另一个元素的直接子元素时会失败。
treeNodePtr findLCA(treeNodePtr root, treeNodePtr p, treeNodePtr q) {
if(!root) {
return NULL;
}
if(root->left==p || root->left==q ||
root->right ==p || root->right ==q) {
return root;
} else {
treeNodePtr l=findLCA(root->left , p , q);
treeNodePtr r=findLCA(root->right , p, q);
if(l && r) {
return root;
}
else if(l) {
return l;
} else {
return r;
}
}
}
代码展示