(1)
-
题目描述:
-
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。
例如如下的先序遍历字符串:
ABC##DE#G##F###
其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
-
输入:
-
输入包括1行字符串,长度不超过100。
-
输出:
-
可能有多组测试数据,对于每组数据,
输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。
每个输出结果占一行。
(2)代码实现
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef struct Node { char value; Node* left; Node* right; }Node; typedef struct BinaryTree { Node* root; }BinaryTree; void InitBinaryTree(BinaryTree* bt, char rootValue) { Node* root = new Node(); root->left = NULL; root->right = NULL; root->value = rootValue; bt->root = root; } void InsertLeftTree(Node* n, char value[], int& pos); void InsertRightTree(Node* n, char value[], int& pos); void InsertTreeNode(BinaryTree* t, char value[], int size) { Node* temp = t->root; int pos = 0; if((++pos)<strlen(value)) InsertLeftTree(t->root, value, pos); if(++pos <strlen(value)) InsertRightTree(t->root, value, pos); } void InsertRightTree(Node* n, char value[], int& pos) { if(value[pos] == '#') return ; Node* node = new Node(); node->value = value[pos]; node->left = NULL; node->right = NULL; n->right = node; if((++pos)<strlen(value)) InsertLeftTree(node, value, pos); if(++pos <strlen(value)) InsertRightTree(node, value, pos); } void InsertLeftTree(Node* n, char value[], int& pos) { if(value[pos] == '#') return ; Node* node = new Node(); node->value = value[pos]; node->left = NULL; node->right = NULL; n->left = node; if((++pos)<strlen(value)) InsertLeftTree(node, value, pos); if(++pos <strlen(value)) InsertRightTree(node, value, pos); } void MidBrowse(Node* node) { if(node->left != NULL) MidBrowse(node->left); cout<<node->value<<" "; if(node->right!=NULL) MidBrowse(node->right); } int main() { BinaryTree bt; char value[101]; memset(value, 0, sizeof(char)*101); while(cin.getline(value, 101)) { InitBinaryTree(&bt, value[0]); InsertTreeNode(&bt, value, strlen(value)); MidBrowse(bt.root); cout<<endl; } }