• 极简二叉树


    二叉树是树形结构中最简单的一种,也是树形内容的关键部分。

    二叉树由一系列节点组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。每个节点包含一个值和两个指向其子节点的指针。

    以下为一个简单的二叉树结构定义,每个节点存储一个整数:

    1. struct TreeNode {
    2. int val;
    3. struct TreeNode* left;
    4. struct TreeNode* right;
    5. };

    二叉树的遍历方式包括先序遍历、中序遍历和后序遍历。这些遍历方式描述了访问二叉树中节点的特定顺序。

    1. 先序遍历(Preorder Traversal):先访问根节点,然后遍历左子树,最后遍历右子树。在具体实现时,首先访问当前节点,然后递归地先序遍历左子树,最后递归地先序遍历右子树。示例代码:

    1. void preorderTraversal(struct TreeNode* root) {
    2. if (root == NULL) {
    3. return;
    4. }
    5. printf("%d ", root->val); // 先访问根节点
    6. preorderTraversal(root->left); // 遍历左子树
    7. preorderTraversal(root->right); // 遍历右子树
    8. }

    2. 中序遍历(Inorder Traversal): 首先遍历左子树,然后访问根节点,最后遍历右子树。在具体实现时,首先递归地中序遍历左子树,然后访问当前节点,最后递归地中序遍历右子树。示例代码:

    1. void inorderTraversal(struct TreeNode* root) {
    2. if (root == NULL) {
    3. return;
    4. }
    5. inorderTraversal(root->left); // 遍历左子树
    6. printf("%d ", root->val); // 访问根节点
    7. inorderTraversal(root->right); // 遍历右子树
    8. }

    3. 后序遍历(Postorder Traversal): 首先遍历左子树,然后遍历右子树,最后访问根节点。在具体实现时,首先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问当前节点。示例代码:

    1. void postorderTraversal(struct TreeNode* root) {
    2. if (root == NULL) {
    3. return;
    4. }
    5. postorderTraversal(root->left); // 遍历左子树
    6. postorderTraversal(root->right); // 遍历右子树
    7. printf("%d ", root->val); // 访问根节点
    8. }

    可以从键盘输入数据创建二叉树,也可以用一个整数数组来初始化二叉树,以下为完整示例代码:

    1. #include
    2. #include
    3. //树节点
    4. struct TreeNode {
    5. int val;
    6. struct TreeNode* left;
    7. struct TreeNode* right;
    8. };
    9. // 建立二叉树
    10. struct TreeNode* createNode(struct TreeNode* parent, int isLeft) {
    11. if (parent == NULL)
    12. printf("请输入二叉树的根节点:");
    13. else
    14. printf("请输入%d的%s子节点:", parent -> val, isLeft ? "左" : "右");
    15. int value;
    16. scanf("%d", &value);
    17. if (value == -1) {
    18. return NULL;
    19. }
    20. struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    21. node->val = value;
    22. node->left = createNode(node, 1);
    23. node->right = createNode(node, 0);
    24. return node;
    25. }
    26. // 根据数组创建二叉树
    27. struct TreeNode* createNodeByValues(int values[], int len, int *index) {
    28. if (values[*index] == -1) {
    29. (*index)++;
    30. return NULL;
    31. }
    32. if (*index >= len) {
    33. return NULL;
    34. }
    35. struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    36. node->val = values[(*index)++];
    37. node->left = createNodeByValues(values, len, index);
    38. node->right = createNodeByValues(values, len, index);
    39. return node;
    40. }
    41. // 先序遍历
    42. void preorderTraversal(struct TreeNode* root) {
    43. if (root == NULL) {
    44. return;
    45. }
    46. printf("%d ", root->val); // 先访问根节点
    47. preorderTraversal(root->left); // 遍历左子树
    48. preorderTraversal(root->right); // 遍历右子树
    49. }
    50. // 中序遍历
    51. void inorderTraversal(struct TreeNode* root) {
    52. if (root == NULL) {
    53. return;
    54. }
    55. inorderTraversal(root->left); // 遍历左子树
    56. printf("%d ", root->val); // 访问根节点
    57. inorderTraversal(root->right); // 遍历右子树
    58. }
    59. // 后序遍历
    60. void postorderTraversal(struct TreeNode* root) {
    61. if (root == NULL) {
    62. return;
    63. }
    64. postorderTraversal(root->left); // 遍历左子树
    65. postorderTraversal(root->right); // 遍历右子树
    66. printf("%d ", root->val); // 访问根节点
    67. }
    68. void freeTree(struct TreeNode* root) {
    69. if (root == NULL) {
    70. return;
    71. }
    72. if (root->left != NULL) {
    73. freeTree(root->left);
    74. }
    75. if (root->right != NULL) {
    76. freeTree(root->right);
    77. }
    78. }
    79. int main() {
    80. // 输入数据创建二叉树
    81. struct TreeNode* root = createNode(NULL, 0);
    82. /*int values[] = {1, 2, 3, -1, 4, -1, -1, 5, -1, -1, 6, -1, -1};
    83. int len = sizeof(values) / sizeof(int);
    84. int index = 0;
    85. // 数组初始化二叉树
    86. struct TreeNode* root = createNodeByValues(values, len, &index);*/
    87. // 先序遍历
    88. printf("先序遍历:");
    89. preorderTraversal(root);
    90. printf("\n");
    91. // 中序遍历
    92. printf("中序遍历:");
    93. inorderTraversal(root);
    94. printf("\n");
    95. // 后序遍历
    96. printf("后序遍历:");
    97. postorderTraversal(root);
    98. printf("\n");
    99. // 释放树
    100. freeTree(root);
    101. return 0;
    102. }
  • 相关阅读:
    动态数据增强及构造方案解决
    C指针 --- 进阶
    OPC C#连接OPC C#上位机链接PLC程序源码
    苹果签名的MDM(Mobile Device Management)?是怎么做的?优势是什么?什么场合需要应用到?
    完全二叉树问题
    Oracle 的开窗函数使用详解(二)
    c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))
    极光发送短信验证码
    unity学习(55)——选择角色界面--解析赋值服务器返回的信息2
    【刷题】蓝桥杯
  • 原文地址:https://blog.csdn.net/jerbo/article/details/133699461