c++先序创建二叉树输入#代表空树
时间: 2024-11-18 20:28:05 浏览: 11
在C++中,使用先序遍历来创建二叉树时,输入通常是一个序列,其中`#`表示空树。这种输入形式常见于文件读取或用户输入中。我们可以使用一个栈和一个指针来模拟这个过程,因为先序遍历的特点是根节点、左子树、右子树。
以下是一个简单的函数示例,它接受一个字符数组作为输入,并返回一个指向根节点的指针:
```cpp
#include <iostream>
#include <string>
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char v) : val(v), left(nullptr), right(nullptr) {}
};
TreeNode* buildTree(std::string inorder, std::string postorder) {
if (inorder.empty()) return nullptr;
// 先序遍历的三个部分:根节点、左子树、右子树
int index = postorder.find('#');
if (index == std::string::npos) index = postorder.size(); // 如果末尾是#,则没有右子树
char rootVal = postorder.substr(0, index);
TreeNode* root = new TreeNode(rootVal);
// 根据先序和中序遍历的关系找到根节点的位置
size_t inRootIndex = inorder.find(rootVal);
std::string leftInorder = inorder.substr(0, inRootIndex);
std::string rightInorder = inorder.substr(inRootIndex + 1);
// 递归地构建左右子树
root->left = buildTree(leftInorder, postorder.substr(0, index));
root->right = buildTree(rightInorder, postorder.substr(index + 1));
return root;
}
int main() {
std::string inputInorder = "abde##gf";
std::string inputPostorder = "g##fbedac"; // 注意:先序的第一个元素是根
TreeNode* tree = buildTree(inputInorder, inputPostorder);
// ...(后续处理树结构)
}
```
在这个例子中,`inputInorder`是中序遍历结果,`inputPostorder`是先序遍历结果(包括`#`)。`buildTree`函数会根据这两个序列构建相应的二叉搜索树。
阅读全文