当前位置:   article > 正文

二叉树的层序创建和层序遍历(c++,c)_c++根据层序遍历建二叉树

c++根据层序遍历建二叉树

层序遍历时顺序为A->B->C->D->E->F->G,先被访问的结点,他的孩子也是先被访问的,层序创建二叉树时,先创建的结点他的孩子也先创建,符合先进先出原则,因此可以用队列来实现。

层序创建和层序遍历的思路大体一致,首先得明白层序遍历。

1.层序遍历

思路:建立一个树节点的队列

第一步,若根节点不为空我们先让根节点入队,判断他的左右孩子是否为空,若不为空打印根节点并让他的孩子入队。
第二步,取出队列头结点,判断他是否有左右孩子,若有让其孩子入队。
重复第二步直到队列为空。

  1. #include <iostream>
  2. using namespace std;
  3. typedef char DataType;
  4. //二叉树数据结构
  5. struct node
  6. {
  7. DataType info; //存放结点数据
  8. struct node* lchild, * rchild; //指向左右孩子的指针
  9. };
  10. typedef struct node* BiTree;
  1. void visit(BiTree T) //输出结点T的数据
  2. {
  3. cout << T->info;
  4. }
  1. void Order(BiTree root)//层序遍历
  2. {
  3. BiTree q[100],p;
  4. int front = -1, rear = -1;//队列,并初始化;
  5. q[++rear] = root;//把根节点入队
  6. while (front != rear)//如果队列不为空就循环
  7. {
  8. p = q[++front];//出队头
  9. visit(p);//打印队头的数据
  10. if (p->lchild != NULL) {//若有左孩子左孩子入队
  11. q[++rear] = p->lchild;
  12. }
  13. if (p->rchild != NULL) {//若有右孩子右孩子入队
  14. q[++rear] = p->rchild;
  15. }
  16. }
  17. }

2.层序创建二叉树

层序创建其实和层序遍历差不多都是一个思想,先创建的他的孩子也先创建。

思路:

 建立一个树节点的队列

第一步,输入的第一个数为根节点,判断是否为空。若根节点不为空我们先让根节点入队。

第二步,开始循环,先出队头结点,之后的两个输入,一个为他的左孩子,一个为右孩子,判断是否为空,不为空则孩子入队

重复第二步直到队列为空。

测试案例:1 2 3 4 5 6 # # # # # # #

  1. /*层序创建二叉树
  2. 函数名:createBiTree
  3. 参数:无
  4. 返回值:二叉树根结点指针
  5. */
  6. BiTree createBiTree(void)
  7. {
  8. char ch;
  9. BiTree root,p;
  10. BiTree q[100]; int front = -1, rear = -1;//队列,并初始化;
  11. cout << "输入你的数据,如果为空则输入#," << endl;
  12. cin >> ch;
  13. root = new struct node;
  14. root->info = ch;
  15. q[++rear] = root;//把根节点入队
  16. while (front != rear)//如果队列不为空就循环
  17. {
  18. p = q[++front];//出队头
  19. cin >> ch;
  20. if (ch != '#') {//不为空,说明有左孩子,就入队
  21. p->lchild= new struct node;
  22. p->lchild->info = ch;
  23. q[++rear] = p->lchild;
  24. }
  25. else {
  26. p->lchild = NULL;//为空就不入队
  27. }
  28. cin >> ch;
  29. if (ch != '#') {//同理右孩子
  30. p->rchild = new struct node;
  31. p->rchild->info = ch;
  32. q[++rear] = p->rchild;
  33. }
  34. else {
  35. p->rchild = NULL;
  36. }
  37. }
  38. return root;
  39. }

这里给出一个无需输#的方式,就是通过数组,先将数组全部赋值为#,之后将输入数据传到数组,循环时直接从数组中拿数据就行,思路与上面的完全一样,但多开辟了空间,也多花了时间。

  1. BiTree createBiTree(void)
  2. {
  3. char ch,string[100];
  4. for (int j = 0; j < 100; j++)
  5. {
  6. string[j] = '#';
  7. }//先让数组全是#,为下面出队做准备
  8. int t=0;
  9. BiTree root,p;
  10. BiTree q[100]; int front = -1, rear = -1;//队列,并初始化;
  11. cout << "输入你的数据,如果为空则输入#,输入&终止" << endl;
  12. cin >> ch;
  13. string[t] = ch;
  14. getchar();
  15. while (ch != '&') {
  16. cin >> ch;
  17. string[++t] = ch;
  18. getchar();
  19. }
  20. string[t] = '#';
  21. t=0;
  22. root = new struct node;
  23. root->info = string[t];
  24. q[++rear] = root;//把根节点入队
  25. while (front != rear)//如果队列不为空就循环
  26. {
  27. p = q[++front];//出队头
  28. ch=string[++t];
  29. if (ch != '#') {//不为空,说明有左孩子,就入队
  30. p->lchild = new struct node;
  31. p->lchild->info = ch;
  32. q[++rear] = p->lchild;
  33. }
  34. else {
  35. p->lchild = NULL;//为空就不入队
  36. }
  37. ch = string[++t];
  38. if (ch != '#') {//同理右孩子
  39. p->rchild = new struct node;
  40. p->rchild->info = ch;
  41. q[++rear] = p->rchild;
  42. }
  43. else {
  44. p->rchild = NULL;
  45. }
  46. }
  47. return root;
  48. }

3.整体代码(这个是需要用#号清空队列的代码,如果要直接输入就用第二个层序创建的代码)

  1. #include <iostream>
  2. using namespace std;
  3. typedef char DataType;
  4. //二叉树数据结构
  5. struct node
  6. {
  7. DataType info; //存放结点数据
  8. struct node* lchild, * rchild; //指向左右孩子的指针
  9. };
  10. typedef struct node* BiTree;
  11. /*层序创建二叉树
  12. 函数名:createBiTree
  13. 参数:无
  14. 返回值:二叉树根结点指针
  15. */
  16. BiTree createBiTree(void)
  17. {
  18. char ch;
  19. BiTree root,p;
  20. BiTree q[100]; int front = -1, rear = -1;//队列,并初始化;
  21. cout << "输入你的数据,如果为空则输入#," << endl;
  22. cin >> ch;
  23. root = new struct node;
  24. root->info = ch;
  25. q[++rear] = root;//把根节点入队
  26. while (front != rear)//如果队列不为空就循环
  27. {
  28. p = q[++front];//出队头
  29. cin >> ch;
  30. if (ch != '#') {//不为空,说明有左孩子,就入队
  31. p->lchild= new struct node;
  32. p->lchild->info = ch;
  33. q[++rear] = p->lchild;
  34. }
  35. else {
  36. p->lchild = NULL;//为空就不入队
  37. }
  38. cin >> ch;
  39. if (ch != '#') {//同理右孩子
  40. p->rchild = new struct node;
  41. p->rchild->info = ch;
  42. q[++rear] = p->rchild;
  43. }
  44. else {
  45. p->rchild = NULL;
  46. }
  47. }
  48. return root;
  49. }
  50. void visit(BiTree T) //输出结点T的数据
  51. {
  52. cout << T->info;
  53. }
  54. void Order(BiTree root)//层序遍历
  55. {
  56. BiTree q[100],p;
  57. int front = -1, rear = -1;//队列,并初始化;
  58. q[++rear] = root;//把根节点入队
  59. while (front != rear)//如果队列不为空就循环
  60. {
  61. p = q[++front];//出队头
  62. visit(p);//打印队头的数据
  63. if (p->lchild != NULL) {//若有左孩子左孩子入队
  64. q[++rear] = p->lchild;
  65. }
  66. if (p->rchild != NULL) {//若有右孩子右孩子入队
  67. q[++rear] = p->rchild;
  68. }
  69. }
  70. }
  71. int main(void)
  72. {
  73. BiTree root = createBiTree();
  74. Order(root);
  75. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/515116
推荐阅读
相关标签
  

闽ICP备14008679号