编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
时间: 2023-06-02 15:06:16 浏览: 194
首先需要了解什么是二叉树的先序遍历。先序遍历是指,先遍历根节点,然后遍历左子树,最后遍历右子树。因此,对于字符串"ABC",其先序遍历建立的二叉树应为:
A
/ \
B C
对于程序,需要按照以下步骤操作:
1. 定义二叉树结点类型,包括结点中的值和指向左右子树的指针。例如:
struct Node{
char val;
Node* left;
Node* right;
};
2. 读入用户输入的先序遍历字符串,并依次遍历每个字符。
3. 如果字符是一个字母,说明当前节点应为该字母,即新建一个结点,并将该字母赋值给结点的值。同时,因为还未读取到该节点的左右子树,因此暂时将左右子树指针设为空。
4. 如果字符是一个分隔符(如空格),说明当前节点的值已读取完毕,需要开始读取其左右子树。因为读取一颗子树也需要先进行先序遍历,因此需要递归地调用本函数。在递归完其左子树后,再递归读取右子树。
5. 读取完左右子树后,返回当前结点。
下面是代码实现的一个示例:
Node* createTree(string& s, int& pos){
//如果已经读到字符串结尾,返回空结点
if(pos >= s.size()) return NULL;
//构建当前结点
Node* root = new Node;
root->val = s[pos++];
root->left = NULL;
root->right = NULL;
//如果下一位不是空格,说明还有左子树
if(pos < s.size() && s[pos] != ' '){
root->left = createTree(s, pos);
}
//如果下一位不是空格,说明还有右子树
if(pos < s.size() && s[pos] != ' '){
root->right = createTree(s, pos);
}
//返回当前结点
return root;
}
int main(){
string preorder = "ABC";
int pos = 0;
Node* root = createTree(preorder, pos);
return 0;
}
阅读全文