用c++写Description 按完全二叉树的顺序表示方式输入节点字母,建立二叉树。并先序遍历二叉树并输出。 Input 有多组数据,每组数据按完全二叉树的顺序表示方式输入每个节点的字母(非空节点数小于等于10),如果节点为空,则输入“#”字符。结束输入“%”符号。 以“@”表示所有输入完毕。 Output 输出各组先序遍历二叉树结果。 Sample Input ABC##DE####FGH% ABC% @ Sample Output ABCDFGEH ABC Hint 先序遍历输出时,如果使用递归实现,给60%分数。如果使用非递归实现,给100%分数。
时间: 2024-03-05 11:49:38 浏览: 21
以下是用 C++ 实现该问题的示例代码:
```cpp
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
void buildTree(TreeNode** root) {
char ch;
cin >> ch;
if (ch == '#') {
*root = NULL;
} else {
*root = new TreeNode(ch);
buildTree(&((*root)->left));
buildTree(&((*root)->right));
}
}
void preOrder(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->val;
preOrder(root->left);
preOrder(root->right);
}
void preOrderIterative(TreeNode* root) {
stack<TreeNode*> s;
TreeNode* cur = root;
while (cur != NULL || !s.empty()) {
while (cur != NULL) {
cout << cur->val;
s.push(cur);
cur = cur->left;
}
cur = s.top();
s.pop();
cur = cur->right;
}
}
int main() {
while (true) {
TreeNode* root = NULL;
buildTree(&root);
if (cin.get() == '@') {
break;
}
preOrderIterative(root);
cout << endl;
}
return 0;
}
```
该程序的思路如下:
1. 定义一个二叉树节点的结构体 `TreeNode`,其中包含节点值和左右子树指针。
2. 定义一个递归函数 `buildTree`,根据输入的完全二叉树的顺序表示方式建立二叉树。如果输入的节点值是 `#`,则表示该节点为空;否则,建立一个新节点,并递归建立其左右子树。
3. 定义一个递归函数 `preOrder`,输出二叉树的先序遍历结果。先输出当前节点的值,再递归输出其左右子树的先序遍历结果。
4. 定义一个非递归函数 `preOrderIterative`,使用栈来实现先序遍历。首先将根节点入栈,然后进入循环,如果栈不为空,就弹出栈顶元素,并输出其值;如果栈顶元素有右子树,则将右子树入栈;最后,将左子树入栈。
5. 在 `main` 函数中,循环读入多组输入数据,对每组数据,先调用 `buildTree` 函数建立二叉树,然后调用 `preOrderIterative` 函数输出先序遍历结果。
注意,每组数据的末尾需要输入一个 `%` 符号,所有数据的末尾需要输入一个 `@` 符号。