求节点x的所有子孙节点
时间: 2023-08-23 07:22:28 浏览: 143
好的,下面是用C++实现求节点x的所有子孙节点的函数:
```c++
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void getDescendants(TreeNode* root, TreeNode* x, vector<TreeNode*>& descendants) {
if (!root) {
return;
}
if (root->left) {
getDescendants(root->left, x, descendants);
}
if (root->right) {
getDescendants(root->right, x, descendants);
}
if (root == x) {
descendants.push_back(root);
} else if (descendants.size() > 0) {
descendants.push_back(root);
}
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
root->right->left = new TreeNode(6);
root->right->right = new TreeNode(7);
vector<TreeNode*> descendants;
getDescendants(root, root->left, descendants);
for (int i = 0; i < descendants.size(); i++) {
cout << descendants[i]->val << " ";
}
cout << endl; // 输出2 4 5,表示节点2的所有子孙节点为2、4、5
descendants.clear();
getDescendants(root, root->right, descendants);
for (int i = 0; i < descendants.size(); i++) {
cout << descendants[i]->val << " ";
}
cout << endl; // 输出3 6 7,表示节点3的所有子孙节点为3、6、7
return 0;
}
```
在该函数中,我们首先递归遍历整个树,找到以x为根节点的子树,将子树中的所有节点保存至descendants数组中。如果遍历到的当前节点是x,则将其加入descendants数组中;如果当前节点不是x,但是descendants数组中已经保存了x节点的子树的节点,那么当前节点也应该被加入descendants数组中。最终,descendants数组中保存的就是节点x的所有子孙节点。
阅读全文