【二叉树】二叉树遍历/根据先序创建二叉树

港控/mmm° 2023-02-19 09:27 39阅读 0赞

题目描述

  1. 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串:
  2. ABC##DE#G##F###其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结

输入

  1. 输入包括1行字符串,长度不超过100

输出

  1. 可能有多组测试数据,对于每组数据,输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。每个输出结果占一行。

样例输入

  1. a#b#cdef#####
  2. a##

样例输出

  1. a b f e d c
  2. a
  3. #include <cstdio>
  4. #include <cstring>
  5. const int maxn = 100;
  6. struct Node{
  7. //结点
  8. char data;
  9. Node *lchild,*rchild;
  10. };
  11. char pre[maxn]; //先序数组
  12. int ans,len; //ans当前指向先序序列位置,len序列长度
  13. //创建二叉树
  14. Node *create(){
  15. if(pre[ans] == '#'){
  16. //#代表空树,ans加 1
  17. ans++;
  18. return NULL;
  19. }
  20. if(ans == len) //序列结束
  21. return NULL;
  22. Node *root = new Node; //创建新结点
  23. root->data = pre[ans++];
  24. root->lchild = create(); //创建左子树
  25. root->rchild = create(); //创建右子树
  26. return root;
  27. }
  28. //中序遍历
  29. void inorder(Node *root){
  30. if(root == NULL) //树为空
  31. return;
  32. inorder(root->lchild); //遍历左子树
  33. if(ans == len - 1) //输出根结点
  34. printf("%c",root->data); //保证一行末尾没有多余的空格
  35. else
  36. printf("%c ",root->data);
  37. inorder(root->rchild); //遍历右子树
  38. }
  39. int main(int argc, char** argv) {
  40. while(scanf("%s",pre) != EOF){
  41. //输入先序序列
  42. ans = 0; //更新当前指向序列位置
  43. len = strlen(pre); //更新序列长度
  44. inorder(create()); //中序输出创建的二叉树
  45. printf("\n");
  46. }
  47. return 0;
  48. }

发表评论

表情:
评论列表 (有 0 条评论,39人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    前两天面试,看见了个笔试题,关于二叉树的,今天算是把自己的一点理解写下来吧。 今天看网文,才想起来,二叉树的先序遍历、中序遍历、后序遍历, 遍历顺序都是

    相关

      二叉树不同于列表、链表、栈、队列这些线性结构,也不同于图这种非线性结构,它属于半线性结构。我们在搞二叉树的时候不要从轮子造起,而要善于引用此前的工作成果,转化成以前已经玩烂