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

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

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

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

相关文章
|
5月前
|
机器学习/深度学习 算法 C语言
详细介绍递归算法在 C 语言中的应用,包括递归的基本概念、特点、实现方法以及实际应用案例
【6月更文挑战第15天】递归算法在C语言中是强大力量的体现,通过函数调用自身解决复杂问题。递归涉及基本概念如自调用、终止条件及栈空间管理。在C中实现递归需定义递归函数,分解问题并设定停止条件。阶乘和斐波那契数列是经典应用示例,展示了递归的优雅与效率。然而,递归可能导致栈溢出,需注意优化。学习递归深化了对“分而治之”策略的理解。**
110 7
|
5月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
46 1
|
6月前
|
IDE 开发工具
遍历思路与子问题思路:详解二叉树的基本操作(二)
这篇内容介绍了二叉树的基本操作,包括通过遍历和子问题思路来解决不同的问题。
37 0
遍历思路与子问题思路:详解二叉树的基本操作(二)
|
6月前
|
算法
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(上)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
37 1
|
6月前
|
机器学习/深度学习 算法 分布式数据库
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(下)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
40 1
|
6月前
遍历思路与子问题思路:详解二叉树的基本操作 (一)
这篇内容介绍了二叉树的基本概念和操作,包括二叉树的结构定义以及一些基本操作如前序遍历、中序遍历、后序遍历、获取树中节点个数等。
47 0
|
6月前
|
算法 C++
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
41 0
|
6月前
|
NoSQL 容器 消息中间件
递归题目树型实战
递归题目树型实战
【C++&数据结构】超详细一文带小白轻松全面理解 [ 二叉搜索树 ]—— [从零实现&逐过程分析&代码演示&简练易懂](23)
【C++&数据结构】超详细一文带小白轻松全面理解 [ 二叉搜索树 ]—— [从零实现&逐过程分析&代码演示&简练易懂](23)
|
6月前
|
算法 Java Serverless
【Java递归】一篇文章带你了解,什么是递归 ,递归的特点,递归应用场景,递归练习题
【Java递归】一篇文章带你了解,什么是递归 ,递归的特点,递归应用场景,递归练习题
133 0