假定用两个一维数组 L[l.. ]和 R[l.. ]作为有 个结点的二叉树的存储 结构 .L[i ]和 ]分别指示结点 的左孩子和右孩子, 表示空。试写一个算法判别结点 是否为结点 的子孙。
时间: 2024-05-10 17:17:22 浏览: 28
算法如下:
1. 如果当前结点为空,则返回 false。
2. 如果当前结点是目标节点,则返回 true。
3. 否则,递归地在左子树和右子树中进行查找:
1. 在 L 数组中找到当前结点的左孩子的下标,记为 leftIndex。
2. 在 R 数组中找到当前结点的右孩子的下标,记为 rightIndex。
3. 递归地在以 leftIndex 为根节点的子树中查找目标节点,如果找到了则返回 true。
4. 递归地在以 rightIndex 为根节点的子树中查找目标节点,如果找到了则返回 true。
4. 如果左子树和右子树中都没有找到目标节点,则返回 false。
代码实现如下(假设目标节点为 target):
```
bool isDescendant(int root, int target, int L[], int R[]) {
if (root == 0) {
return false;
}
if (root == target) {
return true;
}
int leftIndex = L[root];
int rightIndex = R[root];
if (isDescendant(leftIndex, target, L, R)) {
return true;
}
if (isDescendant(rightIndex, target, L, R)) {
return true;
}
return false;
}
```