• 用层序遍历建一棵二叉树


    要求用层序遍历的序列建一棵二叉树,并且用先序序列输出

    层次遍历序列构造二叉树

    让我们先来思考一下怎么层次遍历一棵二叉树:

    1.树不为空,root先入队
    2.进入循环,循环条件为队列不为空,取出队头元素,队头出队。
    3.打印刚刚队头元素的数据。
    4.它如果存在左孩子,左孩子入队。
    5.它如果存在右孩子,右孩子入队。
    6.结束一次循环,回到步骤2

    构造二叉树过程和遍历很相似,假设要构造的二叉树的层次遍历序列存在一个数组里

    1.只要数组不为空,就先入队数组首元素,并用这个值创建二叉树的root。
    2.然后进入循环,循环条件为队列不为空,取出队头元素,队头出队。
    3.只要数组还有元素,就先给刚刚拿出的对头元素创建左孩子,然后左孩子入队。
    4.同上,再创建右孩子,右孩子入队。
    5.结束一次循环。回到2

    例:

    输入样例:

    1 5 12 0 3 0 0 6 0 0 0 0

    输出样例:

    1 5 12 6 11 3

    考虑到有的同学不会用c++中stl里的队列,我们这里分享一种用数组模拟的队列

    数组模拟的队列也很好用,效率还高,要注意的是用数组模拟时,空间定义多大?

    队列一般有两种情况:

    1.如果我们已知有多少元素会入队,开辟一个足够大的计可以。

    2.如果我们不知道有多少元素,用一个循环队列就可以。

    数组模拟队列(固定大小):

    1. //声明队列
    2. Node* q[MaxSize];
    3. //定义 hh为队头 tt为尾
    4. int hh = 0, tt = -1;
    5. //在队尾加入元素,t是一个节点指针
    6. q[++tt] = t;
    7. //取出队头
    8. Node* s = q[hh++];
    9. //队头出队
    10. hh++;

    代码(数组模拟):

    1. #include
    2. using namespace std;
    3. #define MaxSize 1010
    4. typedef long long LL;
    5. //树节点的定义
    6. struct Node {
    7. int e;
    8. Node* leftchild, * rightchild;
    9. };
    10. //创建树节点
    11. //传入这个节点指针的地址,为的是传址调用,把这个节点返回回去
    12. void Create_Node(Node*& t,int x) {
    13. t = (Node*)malloc(sizeof(struct Node));
    14. t->e = x;
    15. t->leftchild = t->rightchild = NULL;
    16. }
    17. //层次遍历序列建树
    18. void Create_Level(Node*& t) {
    19. Node* q[MaxSize];//一个队列,元素类型是节点指针
    20. int hh = 0, tt = -1;//头是hh,尾是tt
    21. int x;
    22. cin >> x;
    23. if (x != 0) {
    24. Create_Node(t, x);
    25. q[++tt] = t;
    26. }
    27. while (hh<=tt) {//队列不空就一直循环
    28. Node* s = q[hh++];//取出队头
    29. //创建左右子节点,注意,如果是0代表没有节点,不用管它
    30. cin >> x;
    31. if (x != 0) {
    32. Create_Node(s->leftchild, x);
    33. q[++tt] = s->leftchild;
    34. }
    35. cin >> x;
    36. if (x != 0) {
    37. Create_Node(s->rightchild, x);
    38. q[++tt] = s->rightchild;
    39. }
    40. }
    41. }
    42. //递归先序遍历
    43. void fun(Node* t) {
    44. if (t == NULL)return;
    45. cout << t->e << " ";
    46. fun(t->leftchild);
    47. fun(t->rightchild);
    48. }
    49. int main()
    50. {
    51. //建树
    52. Node* t;
    53. Create_Level(t);
    54. //遍历树(先序)
    55. fun(t);
    56. return 0;
    57. }

    代码(c++STL   queue):

    1. #include
    2. using namespace std;
    3. typedef long long LL;
    4. //树节点的定义
    5. struct Node {
    6. int e;
    7. Node* leftchild, * rightchild;
    8. };
    9. //创建树节点
    10. //传入这个节点指针的地址,为的是传址调用,把这个节点返回回去
    11. void Create_Node(Node*& t,int x) {
    12. t = (Node*)malloc(sizeof(struct Node));
    13. t->e = x;
    14. t->leftchild = t->rightchild = NULL;
    15. }
    16. //层次遍历序列建树
    17. void Create_Level(Node*& t) {
    18. queue q;//一个队列,元素类型是节点指针
    19. int x;
    20. cin >> x;
    21. if (x != 0) {
    22. Create_Node(t, x);
    23. q.push(t);
    24. }
    25. while (!q.empty()) {//队列不空就一直循环
    26. Node* s = q.front();//取出队头
    27. //创建左右子节点,注意,如果是0代表没有节点,不用管它
    28. cin >> x;
    29. if (x != 0) {
    30. Create_Node(s->leftchild, x);
    31. q.push(s->leftchild);
    32. }
    33. cin >> x;
    34. if (x != 0) {
    35. Create_Node(s->rightchild, x);
    36. q.push(s->rightchild);
    37. }
    38. q.pop();
    39. }
    40. }
    41. //递归先序遍历
    42. void fun(Node* t) {
    43. if (t == NULL)return;
    44. cout << t->e << " ";
    45. fun(t->leftchild);
    46. fun(t->rightchild);
    47. }
    48. int main()
    49. {
    50. //建树
    51. Node* t;
    52. Create_Level(t);
    53. //遍历树(先序)
    54. fun(t);
    55. return 0;
    56. }

    运行结果:

  • 相关阅读:
    【机器学习】scikitLearn正则化l1,l2,提前停止
    API网关功能一览
    Vue生成多文件pdf准考证
    【锁】悲观锁与乐观锁实现
    Spring Cloud Gateway 概述与基本配置(上)
    java基础09
    sql优化实操
    HTTP Debugger抓包
    mysql中表与表之间的方式有几种
    Vue一些你不知道的东西
  • 原文地址:https://blog.csdn.net/qq_59183443/article/details/127898307