使用c++编写一段完整代码,要求: 键盘输入二叉树结点前序序列,创建一棵二叉树 实现SwapTree方法,以根结点为参数,交换每个结点的左子树和右子树 实现Find方法,查找值为key的结点,并输出该结点的所有祖先结点 要求键盘输入二叉树前序序列 空结点以#表示
时间: 2024-11-07 09:13:08 浏览: 49
Python实现重建二叉树的三种方法详解
在C++中,我们可以先定义一个二叉树节点结构体,然后使用递归方法实现前序遍历、交换树结构以及查找功能。这里是一个完整的示例代码:
```cpp
#include <iostream>
#include <stack>
using namespace std;
// 定义二叉树节点
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 前序遍历生成二叉树
TreeNode* buildTreeFromPreorder(vector<int>& preorder) {
if (preorder.empty()) return nullptr;
TreeNode* root = new TreeNode(preorder[0]);
stack<TreeNode*> s;
s.push(root);
for (int i = 1; i < preorder.size(); i++) {
TreeNode* node = new TreeNode(preorder[i]);
if (node->val != '#') { // 非空节点
if (s.top()->val > node->val) {
s.top()->right = node;
} else {
s.top()->left = node;
}
s.push(node);
} else {
TreeNode* parent = s.top();
while (!s.empty() && s.top()->val != preorder[i - 1]) {
parent = s.top();
s.pop();
}
if (!s.empty()) {
parent->left = nullptr;
}
}
}
return root;
}
// 交换左右子树
void SwapTree(TreeNode*& root) {
if (root != nullptr) {
swap(root->left, root->right);
SwapTree(root->left);
SwapTree(root->right);
}
}
// 查找并输出所有祖先
void findAncestors(TreeNode* root, int key, vector<TreeNode*>& ancestors) {
if (root == nullptr || root->val == key) {
return;
}
if (root->val > key) {
findAncestors(root->left, key, ancestors);
} else {
findAncestors(root->right, key, ancestors);
}
if (root->val > key) {
ancestors.push_back(root);
}
}
int main() {
vector<int> preorder = {1, #, 2, 3, #, 4, #, 5};
TreeNode* tree = buildTreeFromPreorder(preorder);
cout << "Original Tree:\n";
printTree(tree); // 自己实现的打印树函数
SwapTree(tree);
cout << "\nAfter swapping tree:\n";
printTree(tree); // 打印交换后的树
vector<TreeNode*> ancestors;
findAncestors(tree, 4, ancestors);
if (!ancestors.empty()) {
cout << "\nAncestors of key 4: ";
for (auto& ancestor : ancestors) {
cout << ancestor->val << " ";
}
}
return 0;
}
```
这个程序首先根据前序遍历构建二叉搜索树,然后提供了一个`SwapTree`函数用于交换树结构,`findAncestors`函数则用于查找目标节点及其所有祖先。注意,这个代码里并没有包含`printTree`函数,你需要自行实现一个用于打印二叉树的辅助函数。
阅读全文