实现函数,获取二叉树里面任意两个节点的距离:
```cpp
struct TreeNode{
TreeNode* left;
TreeNode* right;
};
int distance(TreeNode* proot,TreeNode* p,TreeNode* q)
```cpp
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
};
int distance(TreeNode* proot,TreeNode* p,TreeNode* q)
{
if (proot == nullptr)
return 0;
TreeNode* father = FindFather(proot, p, q);
int dis1 = rootDisNode(proot, p);
int dis2 = rootDisNode(proot, q);
int tmp = rootDisNode(proot, father);
return dis1 + dis2 - 2 * tmp;
}
TreeNode* FindFather(TreeNode* proot, TreeNode* p, TreeNode* q)
{
if (proot == nullptr)
return nullptr;
if (p == proot || q == proot)
return proot;
TreeNode* left = FindFather(proot->left, p, q);
TreeNode* right = FindFather(proot->right, p, q);
if (left && right)
return proot;
if (left != nullptr)
return left;
else
return right;
}
int rootDisNode(TreeNode* proot, TreeNode* pNode)
{
if (proot == nullptr)
return -1;//找不到
if (proot == pNode)
return 0;
int level = rootDisNode(proot->left, pNode);
if (level == -1)//如果左边没找到,就找右边
{
rootDisNode(proot->right, pNode);
}
else//左边找到了
{
return level + 1;
}
}