建立-棵二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。节点存入字符
时间: 2024-02-18 17:04:52 浏览: 26
好的,我来为您解答这个问题。
首先,我们需要定义二叉树的节点结构体,该结构体包含一个字符类型的数据成员,以及两个指向左右子节点的指针。
```c++
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
```
接下来,我们可以编写建立二叉树的函数,该函数输入一个字符串,将其中的每个字符依次插入到二叉树中。
```c++
TreeNode* buildTree(string s) {
if (s.empty()) return NULL;
TreeNode* root = new TreeNode(s[0]);
stack<TreeNode*> st;
st.push(root);
for (int i = 1; i < s.size(); i += 2) {
TreeNode* node = new TreeNode(s[i + 1]);
if (s[i] == 'L') {
st.top()->left = node;
} else {
st.top()->right = node;
}
if (s[i + 1] != '#') {
st.push(node);
} else {
while (!st.empty() && st.top()->right != NULL) {
st.pop();
}
if (!st.empty()) st.pop();
}
}
return root;
}
```
该函数使用了栈来辅助建立二叉树,具体实现过程如下:
1. 将根节点入栈。
2. 从输入字符串中依次读取每个字符,如果是'L',则表示当前节点是其父节点的左子节点,如果是'R',则表示当前节点是其父节点的右子节点。
3. 如果当前字符不是'#',则表示当前节点有子节点,将其入栈。
4. 如果当前字符是'#',则表示当前节点没有子节点,需要将其父节点出栈,直到找到一个还有右子节点未被处理的节点,将其出栈。
5. 重复步骤2-4,直到处理完所有字符。
建立完二叉树后,我们可以编写三个遍历函数,分别实现先序、中序和后序遍历,并将遍历结果打印出来。
```c++
void preorderTraversal(TreeNode* root) {
if (root == NULL) return;
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
void inorderTraversal(TreeNode* root) {
if (root == NULL) return;
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
void postorderTraversal(TreeNode* root) {
if (root == NULL) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val << " ";
}
```
最后,我们可以将以上函数组合起来,实现对二叉树的建立和遍历。
```c++
int main() {
string s = "A(L(B(L(D(#,F(#,#)),#)),C(#,E(#,G(#,#))))";
TreeNode* root = buildTree(s);
cout << "Preorder traversal: ";
preorderTraversal(root);
cout << endl;
cout << "Inorder traversal: ";
inorderTraversal(root);
cout << endl;
cout << "Postorder traversal: ";
postorderTraversal(root);
cout << endl;
return 0;
}
```
该程序输出的结果为:
```
Preorder traversal: A B D F C E G
Inorder traversal: D F B A C E G
Postorder traversal: F D G E C B A
```
这就是建立二叉树并进行遍历的完整代码,希望能够帮到您!