题目:二叉树的结点定义如下:
struct TreeNode
{
int m_nvalue;
TreeNode* m_pLeft;
TreeNode* m_pRight;
};
输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。
解法:
要想找到两个节点的最低共同父结点,其实就是找一个节点,使得它的左子树包含两个结点中的一个结点,右子树包含另外一个节点。该算法的C代码可以写成如下:
Node * pResult = null;
int GetChildNode(Node * pRoot, Node * node_1, Node * node_2)
{
if (null != pResult) return 0;
int sum = 0;
if (null == pRoot)return sum;
if (pRoot == node_1)sum += 1;
if (pRoot == node_2)sum += 1;
sum += GetChildNode(pRoot->m_pLeft, node_1, node_2);
sum += GetChildNode(pRoot->m_pRight, node_1, node_2);
if (2 == sum && null == pResult)
{
pResult = pRoot;
return 0;
}
return sum;
}
如果左子树包含其中一个结点,则将结点的值+1, 同样右子树包含其中一个结点,也将该结点的权重+1,第一个权重为2的结点就是我们要找的最低公共结点。
此算法采用后序遍历的方式。这里考虑了两个节点值相同的情况和一个节点是另一个结点的父结点的情况。
此算法可以很容易拓展到K个节点的最低共同父结点的问题