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

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

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

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月前
|
DataX
二叉树链式结构的实现(二叉树的遍历以及各种常用功能函数的实现)
二叉树链式结构的实现(二叉树的遍历以及各种常用功能函数的实现)
57 0
|
7月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
54 1
|
8月前
|
IDE 开发工具
遍历思路与子问题思路:详解二叉树的基本操作(二)
这篇内容介绍了二叉树的基本操作,包括通过遍历和子问题思路来解决不同的问题。
46 0
遍历思路与子问题思路:详解二叉树的基本操作(二)
|
8月前
|
机器学习/深度学习 算法 分布式数据库
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(下)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
43 1
|
8月前
|
算法
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码(上)
数据结构与算法⑭(第四章_下)二叉树的模拟实现和遍历代码
42 1
|
8月前
遍历思路与子问题思路:详解二叉树的基本操作 (一)
这篇内容介绍了二叉树的基本概念和操作,包括二叉树的结构定义以及一些基本操作如前序遍历、中序遍历、后序遍历、获取树中节点个数等。
59 0
【C++&数据结构】超详细一文带小白轻松全面理解 [ 二叉搜索树 ]—— [从零实现&逐过程分析&代码演示&简练易懂](23)
【C++&数据结构】超详细一文带小白轻松全面理解 [ 二叉搜索树 ]—— [从零实现&逐过程分析&代码演示&简练易懂](23)
|
存储 算法
【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解
【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解
87 0
|
存储
【二叉树】——链式结构(快速掌握递归与刷题技巧)
【二叉树】——链式结构(快速掌握递归与刷题技巧)
176 0
|
Java
java实现树的前序遍历,递归和非递归实现(简单明了)
java实现树的前序遍历,递归和非递归实现(简单明了)
114 0

热门文章

最新文章