• 数据结构--二叉树遍历


    目录

    1.介绍

    (1)前序遍历

    (2)定义结构体

    (3)前序遍历实现

    (4)中序遍历实现

    (5)二叉树的节点个数

    (6)二叉树树叶节点个数

    (7)二叉树的高度

    (8)二叉树节点的开辟

    (9)建立一个测试二叉树

    (10)测试二叉树相关函数的功能

    (11)第k层的数据个数

    (12)二叉树里面查找节点


    1.介绍

    (1)前序遍历

    前序遍历就是针对于树根而言的,就是这个树的树根是先被我们遍历的,因为这个二叉树里面划分为树根,左子树和右子树,这个前中后表示的就是这三个里面的树根的访问顺序,树根先被访问就是前序遍历,树根是第二个被访问的就是中序遍历,最后被访问到就是后序遍历;

    (2)定义结构体

    下面看一下这个前序遍历的具体实现;

    首先我们要进行这个结构体的定义,这个结构体就是表示的每一个节点,具体来讲就是包括这个节点数据,节点的左节点,节点的右节点;

    (3)前序遍历实现

    这个代码里面的N表示的就是这个位置的节点是不存在的,因为不是所有的节点都存在,就是标准情况下,一个节点应该是有两个子节点的,一个左节点,一个右节点,但是不可避免的有的节点是没有左节点,或者是没有右节点的,这个时候我们不会不打印任何数据,而是使用N代替说明这个位置的节点不存在;

    (4)中序遍历实现

    这个就是先访问左边的节点,再访问根节点,最后访问右边的节点,没有字节点的就会打印N代替

    (5)二叉树的节点个数

    这个地方是使用的递归的方法,如果自己没有根节点,说明这个二叉树的节点的个数是0,否则就是用递归去进行节点个数的计算;

    (6)二叉树树叶节点个数

    这个也是分为有树根节点,没有树根节点,以及正常的使用递归进行计算的情况,这个时候使用递归进行计算就不需要加上1,因为上面的加1表示这个要加上树根节点,但是这个地方计算的是树叶节点,所以不需要加上1;

    (7)二叉树的高度

    这个地方是使用这个leftheight表示这个左子树的高度,rightheight表示这个右子树的高度,这个地方其实是可以直接写到返回值里面的,但是这个地方使用的是递归,如果不进行这个临时变量的定义而是直接写到这个return里面,这个调用的次数就会增加,放到oj里面运行就不会通过,显示这个运行时间过长,我们定义两个中间变量就可以去解决这个问题;

    (8)二叉树节点的开辟

    使用malloc函数开辟内存空间,需要包含对应的文件stdlib.h

    (9)建立一个测试二叉树

    调用上面的buynode函数进行这个节点开辟,并建立不同的节点之间的连接关系,最后返回第一个节点;

    (10)测试二叉树相关函数的功能

    打印输出这个二叉树的高度,节点个数,树叶节点个数进行这个功能的测试;

    (11)第k层的数据个数

    使用递归,把下一层即k-1层的左子树和右子树节点数量的和作为这个返回值;

    (12)二叉树里面查找节点

    这个里面就是查找某一个特定的节点,这个节点作为返回值,我们定义两个临时变量作为左子树和右子树的返回值,如果左子树找到这个节点,我们就可以直接返回,否则的话,我们就需要去右子树去查找,找到这个节点后作为返回值,如果左子树,右子树找不到的话就返回NULL;

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include<stdio.h>
    3. #include<stdlib.h>
    4. typedef int btdatatype;
    5. typedef struct binarytreenode
    6. {
    7. btdatatype data;
    8. struct binarytree* left;
    9. struct binarytree* right;
    10. }btnode;
    11. void prevorder(btnode* root)
    12. {
    13. if (root == NULL)
    14. {
    15. printf("N ");
    16. return;
    17. }
    18. printf("%d ", root->data);
    19. prevorder(root->left);
    20. prevorder(root->right);
    21. }
    22. void inorder(btnode* root)
    23. {
    24. if (root == NULL)
    25. {
    26. printf("N ");
    27. return;
    28. }
    29. inorder(root->left);
    30. printf("%d ", root->data);
    31. inorder(root->right);
    32. }
    33. int treesize(btnode* root)
    34. {
    35. if (root == NULL)
    36. {
    37. return 0;
    38. }
    39. return treesize(root->left) + treesize(root->right) + 1;
    40. }
    41. int leafsize(btnode* root)
    42. {
    43. if (root == NULL)
    44. return 0;
    45. if (root->left == NULL && root->right == NULL)
    46. return 1;
    47. return leafsize(root->left) + leafsize(root->right);
    48. }
    49. int heightsize(btnode* root)
    50. {
    51. if (root == NULL)
    52. return 0;
    53. int leftheight = heightsize(root->left);
    54. int rightheight = heightsize(root->right);
    55. return leftheight > rightheight ? heightsize(root->left) + 1 : heightsize(root->right) + 1;
    56. }
    57. int treesizek(btnode* root, int k)
    58. {
    59. if (root == NULL)
    60. {
    61. return 0;
    62. }
    63. if (k == 1)
    64. {
    65. return 1;
    66. }
    67. return treesizek(root->left, k - 1) + treesizek(root->right, k - 1);
    68. }
    69. //二叉树里面查找指定的节点
    70. btnode* treefind(btnode* root, btdatatype x)
    71. {
    72. if (root == NULL)
    73. {
    74. return NULL;
    75. }
    76. if (root->data == x)
    77. {
    78. return root;
    79. }
    80. btnode* ret1 = treefind(root->left, x);
    81. if (ret1)
    82. {
    83. return ret1;
    84. }
    85. btnode* ret2 = treefind(root->right, x);
    86. if (ret2)
    87. {
    88. return ret2;
    89. }
    90. return NULL;
    91. }
    92. btnode* buynode(int x)
    93. {
    94. btnode* node = (btnode*)malloc(sizeof(btnode));
    95. if (node == NULL)
    96. {
    97. perror("malloc fail");
    98. return;
    99. }
    100. node->data = x;
    101. node->left = NULL;
    102. node->right = NULL;
    103. }
    104. btnode* creattree()
    105. {
    106. btnode* node1 = buynode(1);
    107. btnode* node2 = buynode(2);
    108. btnode* node3 = buynode(3);
    109. btnode* node4 = buynode(4);
    110. btnode* node5 = buynode(5);
    111. btnode* node6 = buynode(6);
    112. node1->left = node2;
    113. node1->right = node4;
    114. node2->left = node3;
    115. node4->left = node5;
    116. node4->right = node6;
    117. return node1;
    118. }
    119. int main()
    120. {
    121. btnode* root = creattree();
    122. prevorder(root);
    123. printf("\n");
    124. inorder(root);
    125. printf("\n");
    126. int size = treesize(root);
    127. printf("treesize:%d\n", size);
    128. int size2 = leafsize(root);
    129. printf("leafsize:%d\n", size2);
    130. int size3 = heightsize(root);
    131. printf("heightsize:%d\n", size3);
    132. int size4 = treesizek(root,3);
    133. printf("treesizek:%d\n", size4);
    134. return 0;
    135. }

  • 相关阅读:
    Word处理控件Aspose.Words功能演示:在Word文档中创建可填充表单
    计算机毕业设计Java博弈论学习网站(源码+系统+mysql数据库+lw文档)
    react 也就这么回事 05 —— 组件 & Props
    案例图解:某投资集团企业主数据项目实践分享
    IDEA创建Java Web项目
    python基于PHP+MySQL的汽车维修管理系统
    MySQL - DCL(数据控制语言)介绍
    亚商投资顾问 早餐FM/1103联储连续第四次加息75个基点
    二维数组的最小路径和问题
    多线程进阶2 - 哈希表
  • 原文地址:https://blog.csdn.net/binhyun/article/details/140413066