• 基于非链式(数组)结点结构的二叉树的前(先)序输入创建以及遍历


    点击链接返回标题->基于非链式(数组)结点结构的二叉树的层序、先序、中序、后序输入创建以及层序、先序、中序、后序输出-CSDN博客


    我们采用递归的思想,不断去找空结点(值为-1的结点),在找空结点这个过程中,将输入的x的值(即有效结点)“顺路”插入树中,直到发现输入的值是-1,也就是来到了空结点的位置,延递归路线返回即可,并遵循“先递归左子树,再递归右子树”的顺序,也就是先序的根左右

    1. #include<iostream>
    2. using namespace std;
    3. typedef int datatype;
    4. const int MAX = 8;
    5. struct binTree {
    6. datatype tree[2 * MAX + 7];//该数组的最大容量必须超过最大结点数的两倍,用以存放空结点!
    7. int size;//当前有效结点个数
    8. };
    9. void create_tree_pre(binTree* tree, int i = 1) {//按先序创建二叉树
    10. int x;
    11. cin >> x;
    12. if (x != -1) {
    13. tree->tree[i] = x;
    14. tree->size++;
    15. }
    16. else return;//如果当前插入结点是-1的话,显然当前递归路线该返回了
    17. create_tree_pre(tree, i * 2);
    18. create_tree_pre(tree, i * 2 + 1);
    19. }
    20. void travse_pre(binTree* tree, int i = 1) {//二叉树的先序遍历
    21. if (tree->tree[i] == -1) return;//访问到空结点,该递归路线需要返回
    22. //根,左,右
    23. printf("%d ", tree->tree[i]);
    24. travse_pre(tree, i * 2);
    25. travse_pre(tree, i * 2 + 1);
    26. }

    完整测试代码如下:

    样例输入:

    1 2 4 -1 -1 5 -1 -1 3 6 -1 -1 7 -1 -1

    样例输出:

    层序遍历结果——1       2       3       4       5       6       7
    先序遍历结果——1       2       4       5       3       6       7
    中序遍历结果——4       2       5       1       6       3       7
    后序遍历结果——4       5       2       6       7       3       1

    1. #include<iostream>
    2. using namespace std;
    3. typedef int datatype;
    4. const int MAX = 8;
    5. struct binTree {
    6. datatype tree[2 * MAX + 7];//该数组的最大容量必须超过最大结点数的两倍,用以存放空结点!
    7. int size;//当前有效结点个数
    8. };
    9. void create_tree_pre(binTree* tree, int i = 1) {//按先序创建二叉树
    10. int x;
    11. cin >> x;
    12. if (x != -1) {
    13. tree->tree[i] = x;
    14. tree->size++;
    15. }
    16. else return;//如果当前插入结点是-1的话,显然当前递归路线该返回了
    17. create_tree_pre(tree, i * 2);
    18. create_tree_pre(tree, i * 2 + 1);
    19. }
    20. void travse_seq(binTree* tree) {//二叉树的层序遍历
    21. int len = tree->size, i = 1;
    22. while (len) {
    23. if (tree->tree[i] != -1) {//访问到的不是空结点就输出,并让len自减,len为0时所有有效结点均被输出
    24. printf("%d ", tree->tree[i++]);
    25. len--;
    26. }
    27. }
    28. }
    29. void travse_pre(binTree* tree, int i = 1) {//二叉树的先序遍历
    30. if (tree->tree[i] == -1) return;//访问到空结点,该递归路线需要返回
    31. //根,左,右
    32. printf("%d ", tree->tree[i]);
    33. travse_pre(tree, i * 2);
    34. travse_pre(tree, i * 2 + 1);
    35. }
    36. void travse_mid(binTree* tree, int i = 1) {//二叉树的中序遍历
    37. if (tree->tree[i] == -1) return;
    38. //左,根,右
    39. travse_mid(tree, i * 2);
    40. printf("%d ", tree->tree[i]);
    41. travse_mid(tree, i * 2 + 1);
    42. }
    43. void travse_nex(binTree* tree, int i = 1) {//二叉树的后序遍历
    44. if (tree->tree[i] == -1) return;
    45. //左,右,根
    46. travse_nex(tree, i * 2);
    47. travse_nex(tree, i * 2 + 1);
    48. printf("%d ", tree->tree[i]);
    49. }
    50. void test(binTree* tree) {
    51. create_tree_pre(tree);
    52. cout << "层序遍历结果——";
    53. travse_seq(tree);
    54. cout << endl;
    55. cout << "先序遍历结果——";
    56. travse_pre(tree);
    57. cout << endl;
    58. cout << "中序遍历结果——";
    59. travse_mid(tree);
    60. cout << endl;
    61. cout << "后序遍历结果——";
    62. travse_nex(tree);
    63. cout << endl;
    64. }
    65. int main() {
    66. binTree tree;
    67. tree.size = 0;
    68. memset(tree.tree, -1, sizeof(tree.tree));//初始化树的相关信息
    69. test(&tree);
    70. }

  • 相关阅读:
    护眼灯作用大吗 ?推荐品质好的护眼灯
    Kotlin 中的 apply 函数详解
    Mysql事务+redo日志+锁分类+隔离级别+mvcc
    stm32单片机个人学习笔记3(GPIO输出)
    C. Element Extermination
    nvm安装及使用
    11、Vue的生命周期
    MHA高可用配置及故障切换
    “益路同行”栏目专访第11期——柳州市雨花敬老服务中心陈勇梅
    使用java.util.Timer实现定时任务,详解Thread.sleep() in a loop, probably busy-waiting问题
  • 原文地址:https://blog.csdn.net/liKeQing1027520/article/details/134540323