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

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

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

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

相关文章
|
7月前
|
存储 算法 C语言
C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作
C语言---数据结构实验---哈夫曼树及哈夫曼编码的算法实现---图的基本操作
|
4月前
|
Python Java Go
Python每日一练(20230421) 组合总和II、加一、中后序遍历构造二叉树
Python每日一练(20230421) 组合总和II、加一、中后序遍历构造二叉树
25 0
Python每日一练(20230421) 组合总和II、加一、中后序遍历构造二叉树
|
4月前
|
算法 C++
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
15 0
【C++&数据结构】超详细一文带小白轻松全面理解 [ 二叉搜索树 ]—— [从零实现&逐过程分析&代码演示&简练易懂](23)
【C++&数据结构】超详细一文带小白轻松全面理解 [ 二叉搜索树 ]—— [从零实现&逐过程分析&代码演示&简练易懂](23)
|
6月前
|
存储 算法
【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解
【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解
28 0
|
10月前
递归的理解与应用(详细)(上)
递归的理解与应用(详细)
|
10月前
递归的理解与应用(详细)(下)
递归的理解与应用(详细)(下)
|
11月前
|
算法 UED 容器
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力(上)
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力
85 0
|
11月前
|
算法 容器
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力(下
【算法入门&二叉树】从先中后序的遍历到用中后序列构造二叉树|如何抵挡递归法该死的魅力
60 0