二叉树的运用(递归)(遍历方式)(简洁.含代码,习题)(一)

简介: 二叉树的运用(递归)(遍历方式)(简洁.含代码,习题)

一、前,中,后序——三种遍历方式

1:前,中,后序遍历

image.png

访问方向图示:(后续解题思路)

image.png

2.原理图示:(递归)

ps:以中序遍历为例

image.png

3.代码实现

//Preorder,Inorder,postorder,代码区别在于打印位置
void Order(BTNode* root) {
  if (root == NULL) {
    printf("NULL ");
    return;
  }
  printf("%d ", root->data);//Preorder前序
  Order(root->left);
    printf("%d ", root->data);//Inorder中序
  Order(root->right);
    printf("%d ", root->data);//postorder后序
}

二、层序遍历(利用队列)

1.层序遍历原理图示:

image.png


2.代码实现

节点
typedef int BTDataType;
typedef struct BinaryTreeNode
{
  BTDataType data;
  struct BinaryTreeNode* left;
  struct BinaryTreeNode* right;
}BTNode;
void LevelOrder(BTNode* root)
{
  Queue q;
  QueueInit(&q);
  if (root)
    QueuePush(&q, root);//入队列
  while (!QueueEmpty(&q))
  {
    BTNode* front = QueueFront(&q);//保存队列头指针
    QueuePop(&q);//出队列
    printf("%d ", front->data);
    if(front->left)
      QueuePush(&q, front->left);
    if (front->right)
      QueuePush(&q, front->right);
  }
  QueueDestroy(&q);
}

3.实际应用:【判断一颗二叉树是否为完全二叉树

原理解析:利用层序遍历,将二叉树遍历完。此时栈中只剩下NULL。只要清空栈的过程中发现非空元素则能够判断其不是完全二叉树,反之成立。

代码实现:

image.png

image.png

三、递归思想在二叉树中的实际应用

1.求二叉树的结点个数:这里不对TreeSize返回值做保存的原因是,返回值不用于判断

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

2.求二叉树的高度:注意要保存递归回来的返回值再做判断,避免进行下一步递归时返回找上一步递归的值,造成低效。

int TreeHeight(BTNode* root)
{
  if (root == NULL)
    return 0;
  int leftHeight = TreeHeight(root->left);//保存递归的值
  int rightHeight = TreeHeight(root->right);
  return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

3.求二叉树第k层的节点数:第1层的第k个节点等于第2层的k-1个节点,以此类推。这里不对TreeSize返回值做保存的原因是,返回值不用于判断

int TreeKLevel(BTNode* root, int k)
{
  assert(k > 0);
  if (root == NULL)
    return 0;
  if (k == 1)
    return 1;
  return TreeKLevel(root->left, k - 1)
    + TreeKLevel(root->right, k - 1);
}

4.二叉树的销毁

void TreeDestory()
{
   if(root==NULL)
     {
      return;
      }
  TreeDestory(root->left);
  TreeDestory(root->right);
  free(root);
}

三、深度DPS/广度BFS优先遍历

     1.深度优先遍历

image.png

  2.广度优先遍历

image.png

相关文章
|
8月前
|
人工智能 Ruby Python
python__init__方法笔记
本文总结了Python中`__init__`方法的使用要点,包括子类对父类构造方法的调用规则。当子类未重写`__init__`时,实例化会自动调用父类的构造方法;若重写,则需通过`super()`或直接调用父类名称来显式继承父类初始化逻辑。文中通过具体代码示例展示了不同场景下的行为及输出结果,帮助理解类属性与成员变量的关系,以及如何正确使用`super()`实现构造方法的继承。
424 9
某市职业经理人高级研修学院网站被植入传播Backdoor.Gpigeon.GEN的代码
某市职业经理人高级研修学院网站被植入传播Backdoor.Gpigeon.GEN的代码
|
存储 算法 C++
【数据结构与算法】:带你手搓顺序表(C/C++篇)
【数据结构与算法】:带你手搓顺序表(C/C++篇)
|
存储 Oracle 关系型数据库
开始、为什么要学数据库
开始、为什么要学数据库
251 0
|
消息中间件 分布式计算 NoSQL
阿里P8面试官推荐学习的11大专题:java面试精讲框架文档
本篇文章给大家分享一波,阿里P8面试官推荐学习的11大专题:java面试精讲框架文档,主要包含11大块的内容:spring、springcloud、netty、zookeeper、kafka、Hadoop、HBASE、Cassandra、elasticsearch、spark、flink;希望大家能够喜欢!!
|
Android开发
“千变万化”——神奇的Android图片规格调整器(dialog技术解析篇)
上篇说道,构思这个app时发现了很多平时未注意的问题,其中以Dialog弹窗为第一拦路虎,一方面是自己的技术不够成熟,一方面是自己平时未多多深入阅读。
183 0
|
Android开发
【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )(一)
【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )(一)
353 0
|
5天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
7天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
869 13
|
3天前
|
云安全 安全
免费+限量+领云小宝周边!「阿里云2026云上安全健康体检」火热进行中!
诚邀您进行年度自检,发现潜在风险,守护云上业务连续稳健运行
1169 1