码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 二叉树的链式结构及遍历


    目录

    1. 定义

    2. 二叉树的遍历 

    2.1 前序、中序以及后序遍历

    2.1.1 前序遍历

    2.1.2 中序遍历

    2.1.3 后序遍历 

    2.2 二叉树的层序遍历

    3. 二叉树节点个数及高度等

    3.1 求节点个数

    3.2 求叶子节点个数

    3.3 求第K层节点个数

    3.4 求二叉树深度

    3.5 二叉树查找值为X的节点


    1. 定义

    1. typedef int BTDataType;
    2. typedef struct BinaryTreeNode
    3. {
    4. BTDataType _data;
    5. struct BinaryTreeNode* _left;
    6. struct BinaryTreeNode* _right;
    7. }BTNode;

    回顾下二叉树的概念,二叉树是:
    1. 空树
    2. 非空:根节点,根节点的左子树、根节点的右子树组成的

    从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的

    2. 二叉树的遍历 

    2.1 前序、中序以及后序遍历

           学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。

    按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历

    前序遍历: 根        左子树        右子树

    中序遍历: 左子树        根        右子树

    后序遍历: 左子树        右子树        根

    注:二叉树的前中后遍历是根据 根节点 的遍历位置判断的

    举例:

    2.1.1 前序遍历

    1. void PreOrder(BTNode* root)
    2. {
    3. if (root == NULL)//便于测试观察
    4. {
    5. printf("# ");
    6. return;
    7. }
    8. printf("%d ", root->data);
    9. PreOrder(root->left);
    10. PreOrder(root->right);
    11. }

    2.1.2 中序遍历

    1. void InOrder(BTNode* root){
    2. if (root == NULL)//便于测试观察
    3. {
    4. printf("# ");
    5. return;
    6. }
    7. InOrder(root->left);
    8. printf("%d ", root->data);
    9. InOrder(root->right);
    10. }

    2.1.3 后序遍历 

    1. void PostOrder(BTNode* root){
    2. if (root == NULL){
    3. printf("# ");
    4. return;
    5. }
    6. PostOrder(root->left);
    7. PostOrder(root->right);
    8. printf("%d ", root->data);
    9. }

    2.2 二叉树的层序遍历

            思路:运用队列,将根节点入队列,当队列不为空的时候,将根节点出队列,同时将左右子树根节点入队。

    1. void BinaryTreeLevelOrder(BTNode* root)
    2. {
    3. Queue q;
    4. QueueInit(&q);
    5. if (root)
    6. {
    7. QueuePush(&q, root);
    8. }
    9. while (!QueueEmpty(&q))
    10. {
    11. BTNode* front = QueueFront(&q);
    12. printf("%d ", front->data);
    13. QueuePop(&q);
    14. if (front->left)
    15. {
    16. QueuePush(&q, front->left);
    17. }
    18. if (front->right)
    19. {
    20. QueuePush(&q, front->right);
    21. }
    22. }
    23. printf("\n");
    24. QueueDestroy(&q);
    25. }


    3. 二叉树节点个数及高度等

    3.1 求节点个数

    1. int TreeSize(BTNode* root)
    2. {
    3. return root == NULL ? 0 :
    4. TreeSize(root->left) + TreeSize(root->right) + 1;
    5. }

    3.2 求叶子节点个数

    1. int TreeLeafSize(BTNode* root)
    2. {
    3. if (root == NULL)//空节点
    4. return 0;
    5. if (root->left== NULL && root->right == NULL)//叶子节点
    6. return 1;
    7. //非空非叶子返回 左子树叶子节点+右子树叶子节点
    8. return TreeLeafSize(root->left) + TreeLeafSize(root->right);
    9. }

    3.3 求第K层节点个数

    1. int TreeKLevel(BTNode* root, int k)
    2. {
    3. assert(k >= 1);
    4. if (root == NULL)//空节点
    5. return 0;
    6. if (k == 1)//递归到了第K层,遇到节点+1
    7. return 1;
    8. //非空非K,返回左子树的K-1层节点数+右子树的K-1层节点数
    9. return TreeKLevel(root->left, k - 1)
    10. + TreeKLevel(root->right, k - 1);
    11. }

    3.4 求二叉树深度

    1. int TreeDepth(BTNode* root)
    2. {
    3. if(root == NULL)
    4. return 0;
    5. int leftDepth = TreeDepth(root->left);
    6. int rightDepth = TreeDepth(root->right);
    7. return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
    8. }

    3.5 二叉树查找值为X的节点

    1. BTNode* TreeFind(BTNode* root, BTDataType x)
    2. {
    3. if (root == NULL)
    4. return NULL;
    5. if (root->data == x)
    6. return root;
    7. BTNode* ret1 = TreeFind(root->left, x);
    8. if (ret1)
    9. return ret1;
    10. BTNode* ret2 = TreeFind(root->right, x);
    11. if (ret2)
    12. return ret2;
    13. return NULL;
    14. }

  • 相关阅读:
    K8s 暴露服务的新方法 Gateway API 详解,它有什么好处?
    【python基础】类详解:如何编写类、__init__()、修改实例属性、类存储到模块并导入、py标准库、编写类的约定
    平行坐标图:高维数据可视化必备图形
    Java程序设计2023-第三次上机测试
    Java 数组_方法_static关键字
    时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测
    用VS软件开发“浪漫烟花“<笔记摘录>
    Mac 上没有 Total Commander,可以用这两款软件来代替
    docker部署Jenkins与任务创建【七千字超详细指南】
    Hadoop启动缺失ResourceManager
  • 原文地址:https://blog.csdn.net/blue_jun_/article/details/126879241
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号