完全二叉树的最近公共祖先
题目描述
完全二叉树采用数组存放,在数组中找到v1和v2的最近公共祖先
思路
将数组的索引当做二叉树的节点,当前节点为root,其左子树为left = root * 2 + 1;右子树为 right = left + 1;,
递归三部曲
- 返回值和参数:输入当前的数组以及起始点root = 0,两个节点值v1和v2,输出v1和v2的最近公共祖先
- 单层递归逻辑:当前节点等于v1或者v2时返回当前节点,当前节点不为v1或者v2,遍历它的左子树和右子树,如果左子树返回-1,说明v1和v2在右子树中,反之在左子树中,如果一个在左一个在右,则当前节点就是他们的最近公共祖先
- 终止递归条件:当前左右子树大于或者等于数组的大小
int backTrace(vector<int>& vec,int root, int v1, int v2)
{
if (root >= vec.size())
return -1;
if (vec[root] == v1 || vec[root] == v2)
return root;
int left = backTrace(vec, root * 2 + 1, v1, v2);
int right = backTrace(vec, root * 2 + 2, v1, v2);
if (left == -1) return right;
if (right == -1) return left;
return root;
}
int main()
{
vector<int> vec{ 1,2,3,4,5,6,7,8,9 };
int res = backTrace(vec, 0, 5, 6);
cout << vec[res];
cout << endl;
}