创建二叉树和实现二叉树的三种遍历 a. 根据提示输入字符型数据创建二叉树,输入值为所有字符型数据 b. 输出为遍历后的每个结点的值的顺序 c. 创建二叉树并能实现二叉树的先序、中序、后序遍历 d. 如果输入数据为:a b c 输出结果为:a b c
时间: 2023-06-06 14:05:20 浏览: 122
答:a. 输入字符型数据,我们可以使用递归方式创建二叉树。对于每一个节点,先输入其值,然后再分别让用户输入其左子节点的值和右子节点的值,如果左右子节点为null则输入"#"。代码如下:
```
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
TreeNode* createTree() {
char c;
cin >> c;
if (c == '#') return NULL; // 输入为#表明该节点为null
TreeNode* root = new TreeNode(c);
root->left = createTree();
root->right = createTree();
return root;
}
```
b. 二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历。我们可以通过递归方式遍历整个二叉树。
前序遍历指先访问节点,再遍历左子树和右子树。
```
void preOrder(TreeNode* root) {
if (root == NULL) return;
cout << root->val << " ";
preOrder(root->left);
preOrder(root->right);
}
```
中序遍历指先遍历左子树,再访问节点,最后遍历右子树。
```
void inOrder(TreeNode* root) {
if (root == NULL) return;
inOrder(root->left);
cout << root->val << " ";
inOrder(root->right);
}
```
后序遍历指先遍历左子树和右子树,最后访问节点。
```
void postOrder(TreeNode* root) {
if (root == NULL) return;
postOrder(root->left);
postOrder(root->right);
cout << root->val << " ";
}
```
c. 如果需要实现前序、中序和后序遍历,我们可以在创建二叉树时,记录下前序和中序遍历的结果,最后从前序和中序遍历的结果中构建出后序遍历的结果。代码如下:
```
TreeNode* createTree(vector<char> preOrder, vector<char> inOrder) {
if (preOrder.empty()) return NULL;
char rootValue = preOrder[0];
int index = distance(inOrder.begin(), find(inOrder.begin(), inOrder.end(), rootValue));
vector<char> leftPre(preOrder.begin() + 1, preOrder.begin() + index + 1);
vector<char> leftIn(inOrder.begin(), inOrder.begin() + index);
vector<char> rightPre(preOrder.begin() + index + 1, preOrder.end());
vector<char> rightIn(inOrder.begin() + index + 1, inOrder.end());
TreeNode* root = new TreeNode(rootValue);
root->left = createTree(leftPre, leftIn);
root->right = createTree(rightPre, rightIn);
return root;
}
void printPostOrder(TreeNode* root) {
if (root == NULL) return;
printPostOrder(root->left);
printPostOrder(root->right);
cout << root->val << " ";
}
void printTree(vector<char> preOrder, vector<char> inOrder) {
TreeNode* root = createTree(preOrder, inOrder);
cout << "前序遍历结果: ";
for (char c : preOrder) {
cout << c << " ";
}
cout << "\n中序遍历结果: ";
for (char c : inOrder) {
cout << c << " ";
}
cout << "\n后序遍历结果: ";
printPostOrder(root);
}
```
d. 对于输入数据"a b c",我们可以先将其存储在vector中,然后通过createTree函数创建出二叉树,最后按照顺序遍历输出每个节点的值。代码如下:
```
int main() {
vector<char> input = {'a', 'b', 'c'};
TreeNode* root = createTree(input);
cout << "遍历结果为: ";
preOrder(root);
inOrder(root);
postOrder(root);
return 0;
}
```
阅读全文