广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言数据结构二叉树递归的方法
  • 422
分享到

C语言数据结构二叉树递归的方法

2023-06-30 12:06:41 422人浏览 八月长安
摘要

本篇内容介绍了“C语言数据结构二叉树递归的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、二叉树的遍历算法二叉树的精髓在于遍历。遍历掌

本篇内容介绍了“C语言数据结构二叉树递归的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、二叉树的遍历算法

二叉树的精髓在于遍历。遍历掌握了后,剩下的问题迎刃而解。

1.构造二叉树

“工欲善其事必利其器”

所以先创建一个结构体。

手动先构造一颗如图所示的二叉树。

C语言数据结构二叉树递归的方法

typedef int BTDataType;//定义二叉树结构体typedef struct BinaryTreenode{<!--{C}%3C!%2D%2D%20%2D%2D%3E-->int data;//节点数据struct BinartTreeNode* left;//左子树struct BinartTreeNode* right;//右子树}BTNode;//构造一棵二叉树BTNode* BuyBTNode(BTDataType x){<!--{C}%3C!%2D%2D%20%2D%2D%3E-->BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){<!--{C}%3C!%2D%2D%20%2D%2D%3E-->printf("malloc fail\n");exit(-1);}node->data = x;node->left = NULL;node->right = NULL;return node;}BTNode* CreatBinaryTree(){<!--{C}%3C!%2D%2D%20%2D%2D%3E-->BTNode* node1 = BuyBTNode(1);BTNode* node2 = BuyBTNode(2);BTNode* node3 = BuyBTNode(3);BTNode* node4 = BuyBTNode(4);BTNode* node5 = BuyBTNode(5);BTNode* node6 = BuyBTNode(6);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return node1;}int main(){<!--{C}%3C!%2D%2D%20%2D%2D%3E-->BTNode* tree = CreatBinaryTree();return 0;}typedef int BTDataType;//定义二叉树结构体typedef struct BinaryTreeNode{int data;//节点数据struct BinartTreeNode* left;//左子树struct BinartTreeNode* right;//右子树}BTNode;//构造一棵二叉树BTNode* BuyBTNode(BTDataType x){BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){printf("malloc fail\n");exit(-1);}node->data = x;node->left = NULL;node->right = NULL;return node;}BTNode* CreatBinaryTree(){BTNode* node1 = BuyBTNode(1);BTNode* node2 = BuyBTNode(2);BTNode* node3 = BuyBTNode(3);BTNode* node4 = BuyBTNode(4);BTNode* node5 = BuyBTNode(5);BTNode* node6 = BuyBTNode(6);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return node1;}int main(){BTNode* tree = CreatBinaryTree();return 0;}

2.前序遍历(递归图是重点.)

C语言数据结构二叉树递归的方法

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

思路:

把每个节点都想成是一棵树。

当树为空时。

当树不为空时,先遍历左子树,后遍历右子树

注意:前中后序遍历不同处只在printf打印的顺序的位置。

// 二叉树前序遍历void PreOrder(BTNode* root){if (root == NULL){printf("NULL ");return;}//打印在前printf("%d ", root->data);PreOrder(root->left);PreOrder(root->right);}

打印结果:

1 2 3 NULL NULL NULL 4 5 NULL NULL 6 NULL NULL

递归分析图:

递归题目的万能的解法。就是画递归图。

二叉树的所有题目,假如你不会,赶快 画递归图 吧

由于递归太庞大,图片太小看不清,所以我把左子树和右子树分开又截了图

红线部分代表压栈递归。

绿线部分代表 返回

C语言数据结构二叉树递归的方法

左子树

C语言数据结构二叉树递归的方法

右子树

C语言数据结构二叉树递归的方法

3.中序遍历

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

void InOrder(BTNode* root){if (root == NULL){printf("NULL ");return;}InOrder(root->left);//打印在中间printf("%d ", root->data);InOrder(root->right);}

打印结果

NULL 3 NULL 2 NULL 1 NULL 5 NULL 4 NULL 6 NULL

4.后序遍历

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

void PostOrder(BTNode* root){if (root == NULL){printf("NULL ");return;}PostOrder(root->left);PostOrder(root->right);//打印在最后printf("%d ", root->data);}

打印结果

NULL NULL 3 NULL 2 NULL NULL 5 NULL NULL 6 4 1

层序遍历

思路:

借助先进先出的性质,上一层节点出的时候,带下一层的节点进去。

先把根入队列。

根节点出来的时候,左右孩子进去。

// 层序遍历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);}}//记得销毁队列printf("\n");QueueDestory(&q);}

二、二叉树遍历算法的应用

1.求节点个数

思想:把大问题逐步分割为子问题。

思路:

树为空时返回0个节点。(树为空不意味着才开始就是空树,而是递归到最后一个为NULL的树返回)

树不为空时返回自己的1个节点+上一颗树返回的节点的个数。

// 二叉树节点个数int BinaryTreeSize(BTNode* root){//当树为空时if (root == NULL)return 0;//当树不为空时return BinaryTreeSize(root->left) +BinaryTreeSize(root->right) + 1;}

求叶子节点个数

思路:

树为NULL时,返回0.

两颗子树都不为NULL时,返回1.

不满足以上两种情况,继续递归左右子树。

// 二叉树叶子节点个数int BinaryTreeLeafSize(BTNode* root){//当树为空时if (root == NULL)return 0;//当两棵 子 树都为空时if (root->left == NULL && root->right == NULL)return 1;return BinaryTreeLeafSize(root->left)+BinaryTreeLeafSize(root->right);}

3.求第k层节点个数

C语言数据结构二叉树递归的方法

思想:求上图第3层节点个数。

站在第1层来看,就是求第3层节点的个数

站在第2层的角度来看,就是求第2层节点的个数

站在第3层的角度来看,就是求第1层节点的个数

思路:

当树为空时返回0

当k为1时返回1。

不满足1和2,继续递归左右子树。

// 二叉树第k层节点个数int BinaryTreeLevelkSize(BTNode* root, int k){//当树为空时if (root == NULL)return 0;//当k为1时if (k == 1)return 1;//程序能走到这一行,说明树不为空,k也不为1.继续递归return BinaryTreeLevelKSize(root->left, k-1)+BinaryTreeLevelKSize(root->right, k - 1);}

4.查找值为x的节点

思想:

把最小规模的问题写在最前面作为限制

不满足最小规模的问题,则继续递归。将问题一步一步拆分为不可分割的子问题。

// 二叉树查找值为x的节点BTNode* BinaryTreeFind(BTNode* root, BTDataType x){//当树为空时if (root == NULL)return NULL;//当树的值等于x时if (root->data == x)return root;BTNode* a = BinaryTreeFind(root->left, x);if (a){return a;}BTNode* b = BinaryTreeFind(root->right, x);if (b){return b;}//没有x,则返回空return NULL;}

5.二叉树销毁

思路:相当于二叉树的后序遍历。

先把左右子树遍历完后,开始遍历根,对根进行free。

// 二叉树销毁void BinaryTreeDestory(BTNode* root){if (root == NULL)return;BinaryTreeDestory(root->left);BinaryTreeDestory(root->right);//free掉根free(root);}

6.前序遍历构建二叉树

思路:

对一串字符进行先序遍历,递归遍历二叉树,当遇见#时开始返回 连接 树。

C语言数据结构二叉树递归的方法

通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树

#include <stdio.h>#include <stdlib.h>typedef struct BTNodeTree{    struct BTNodeTree* left;    struct BTNodeTree* right;    char val;}BTNode;//创建二叉树BTNode* CreateTree(char* a, int* pi){//如果树为#则返回null    if(a[*pi] == '#')    {        (*pi)++;        return NULL;    }    //否则构建节点,同时让pi++,以便继续递归    BTNode* root = (BTNode*)malloc(sizeof(BTNode));    root->val = a[(*pi)++];    //构建左右子树    root->left = CreateTree(a, pi);    root->right = CreateTree(a, pi);    //构建完后返回根节点。    return root;}//中序遍历打印。void inorder(BTNode* root){    if(root == NULL)        return;    inorder(root->left);    printf("%c ", root->val);    inorder(root->right);}int main(){    char a[100];    scanf("%s", a);    int i = 0;    BTNode* tree = CreateTree(a, &i);    inorder(tree);    return 0;}

7.判断二叉树是否是完全二叉树

思路:

层序遍历,空节点也进队列

出到空节点以后,出队列中所有数据,如果全是空,则是完全二叉树

8.求二叉树的深度

思路:二叉树的最大深度等价于:左右子树的最大深度 + 1

int maxDepth(struct TreeNode* root){    if(root == NULL)     {        return 0;    }    size_t left = maxDepth(root->left) + 1;    size_t right = maxDepth(root->right) + 1;    if(right > left)     {        return right;    }    return left;}
//判断二叉树是否是完全二叉树bool BTreeComplete(BTNode* root){Queue q;QueueInit(&q);if (root)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front == NULL)break;QueuePush(&q, front->left);QueuePush(&q, front->right);}while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);//空后面出到非空,那说明不是完全二叉树if (front)return false;}//否则是完全二叉树return true;}

三、二叉树LeetCode题目

以下题目均属于LeetCode的 简单 题目

1.单值二叉树

C语言数据结构二叉树递归的方法

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false。

思想:

看一棵树的三个部分是否相同,相同则继续递归下一颗树,直到树为空。

bool isUnivalTree(struct TreeNode* root){    //当树为空时。    if(root == NULL)    {        return true;    }    //当右树不为空,并且 根 != 左树    //当右树不为空,并且 根 != 右树时    if(root->left != NULL && root->val != root->left->val)    return false;    if(root->right != NULL && root->val != root->right->val)    return false;    //能走到这一行,说明第一层树的值相同了。接着递归左右子树。    return isUnivalTree(root->left) &&             isUnivalTree(root->right);}

2. 检查两颗树是否相同

C语言数据结构二叉树递归的方法

C语言数据结构二叉树递归的方法

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

C语言数据结构二叉树递归的方法

bool isSameTree(struct TreeNode* p, struct TreeNode* q){    //当两树都为空时    if(p == NULL && q== NULL)        return true;    //当其中一个树为空时    if(p == NULL || q == NULL)        return false;    //走到这里说明两树存在,比较两树的值    if(p->val != q->val)        return false;    //走到这里说明两树的根节点相同,继续递归,直到判断完左右子树为止。    return isSameTree(p->left, q->left)     && isSameTree(p->right, q->right);}

3. 对称二叉树

C语言数据结构二叉树递归的方法

给你一个二叉树的根节点 root , 检查它是否轴对称。

bool isSym(struct TreeNode* q, struct TreeNode* p){      //当只有一个根节点时    if(q == NULL && p == NULL)         return true;    //当其中一个子树为空时    if(q == NULL ||p ==NULL)         return false;    //程序走到一这行,说明左右节点存在。当两个根节点不相等时    if(q->val != p->val)    return false;    //走到这一步说明左右节点相同,开始递归左右子树    return isSym(q->left, p->right) && isSym(q->right, p->left); }bool isSymmetric(struct TreeNode* root){    //当是空树时    if(root == NULL)        return true;    return isSym(root->left, root->right);}

4.另一颗树的子树

C语言数据结构二叉树递归的方法

C语言数据结构二叉树递归的方法

C语言数据结构二叉树递归的方法

思路:

用到了上一题判断两棵树是否相同的思想。

bool isSameTree(struct TreeNode* p, struct TreeNode* q){    //当两树都为空时    if(p == NULL && q== NULL)        return true;    //当其中一个树为空时    if(p == NULL || q == NULL)        return false;    //走到这里说明两树存在,比较两树的值    if(p->val != q->val)        return false;    //走到这里说明两树的根节点相同,继续递归    return isSameTree(p->left, q->left)     && isSameTree(p->right, q->right);}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){    //递归结束条件。当根为空时,并不是说明没有节点,可能是所有的子树都遍历过了。然后不相等返回false    if(root == NULL)    return false;//走到这里说明子树不为空,开始比较子树和sub相同不。    bool a = isSameTree(root, subRoot);    if(a)    return a;    //走到这里说明不相同,继续递归左子树和右子树,其中一个相同就返回true。    return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);}

二叉树的前序遍历

C语言数据结构二叉树递归的方法

C语言数据结构二叉树递归的方法

题目思路

求节点个数,开辟数组大小。

前序遍历存放到数组中

 int treeSize(struct TreeNode* root) {     if(root == NULL)        return 0;     return treeSize(root->left) + treeSize(root->right)+1;  } void preorder(int* a, struct TreeNode* root, int* i) {     if(root == NULL)     {          return;     }     a[(*i)++] = root->val;     preorder(a,root->left, i);     preorder(a,root->right, i); }int* preorderTraversal(struct TreeNode* root, int* returnSize){    //计算树有几个节点,然后开辟相应的空间    int size = treeSize(root);    int* a = (int*)malloc(sizeof(int)* size);    int i = 0;//设置下标i    *returnSize = size;//需要返回的数组大小    //前序遍历依次存放到数组中。    preorder(a, root, &i);    return a;}

6.反转二叉树

C语言数据结构二叉树递归的方法

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

我犯的BUG:只是对二叉树里面的值进行交换,但是无法避免空指针。一直都是空指针的错误,因为root总会为空,root->data总会遇见空指针

所以以后尽量要多想着交换地址。

void _invertTree(struct TreeNode* root){    if(root)    {        struct TreeNode* tmp = root->left;        root->left = root->right;        root->right = tmp;        _invertTree(root->left);        _invertTree(root->right);    }}struct TreeNode* invertTree(struct TreeNode* root){    _invertTree(root);    return root;}

“C语言数据结构二叉树递归的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C语言数据结构二叉树递归的方法

本文链接: https://www.lsjlt.com/news/328852.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言数据结构二叉树递归的方法
    本篇内容介绍了“C语言数据结构二叉树递归的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、二叉树的遍历算法二叉树的精髓在于遍历。遍历掌...
    99+
    2023-06-30
  • C语言植物大战数据结构二叉树递归
    目录前言一、二叉树的遍历算法1.构造二叉树2.前序遍历(递归图是重点.)3.中序遍历4.后序遍历二、二叉树遍历算法的应用1.求节点个数3.求第k层节点个数4.查找值为x的节点5.二叉...
    99+
    2022-11-13
  • 数据结构 二叉树的递归与非递归
    数据结构 二叉树的递归与非递归 实例代码: #include <iostream> #include <queue> #include <stack> #inc...
    99+
    2022-06-04
    递归 数据结构 与非
  • 编程语言中数据结构之二叉树递归与非递归的示例分析
    这篇文章主要为大家展示了“编程语言中数据结构之二叉树递归与非递归的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“编程语言中数据结构之二叉树递归与非递归的示例分析”这篇文章吧。数据结构 二...
    99+
    2023-06-09
  • C语言数据结构之二叉树详解
    目录1. 树概念及结构1.1树概念1.2树的表示2. 二叉树概念及结构2.1概念2.2数据结构中的二叉树2.3特殊的二叉树2.4二叉树的存储结构2.5二叉树的性质3. 二叉树顺序结构...
    99+
    2022-11-13
  • C语言数据结构之二叉链表创建二叉树
    目录一、思想(先序思想创建)二、创建二叉树(1)传一级参数方法(2)传二级参数方法一、思想(先序思想创建) 第一步先创建根节点,然后创建根节点左子树,开始递归创建左子树,直到递归创建...
    99+
    2022-11-13
  • C语言数据结构系列篇二叉树的概念及满二叉树与完全二叉树
    链接:C语言数据结构系列之树的概念结构和常见表示方法 0x00 概念 定义:二叉树既然叫二叉树,顾名思义即度最大为2的树称为二叉树。 它的度可以为 1 也可...
    99+
    2022-11-13
  • C语言进阶练习二叉树的递归遍历
    目录二叉树的前中后序遍历遍历二叉树求二叉树的结点个数遍历二叉树求二叉树的叶子结点个数求二叉树中data为x的结点求二叉树的深度二叉树的前中后序遍历 所谓二叉树遍历(Traversal...
    99+
    2022-11-13
  • C语言植物大战数据结构二叉树堆
    目录前言堆的概念创建结构体初始化结构体销毁结构体向堆中插入数据1.堆的物理结构和逻辑结构2.完全二叉树下标规律3.插入数据思路依次打印堆的值删除堆顶的值判断堆是否为空求堆中有几个元素...
    99+
    2022-11-13
  • C语言数据结构系列篇二叉树的遍历
    目录前言:Ⅰ.  定义二叉树0x00 二叉树的概念(回顾)0x00 定义二叉树0x01 手动创建二叉树Ⅱ.  二叉树的遍历...
    99+
    2022-11-13
  • C语言二叉树的概念结构详解
    目录1、树的概念及结构(了解)1.1树的概念:1.2树的表示法:2、二叉树的概念及结构2.1二叉树的概念2.2特殊的二叉树2.2二叉树的性质2.3二叉树的顺序存储2.4二叉树的链式存...
    99+
    2022-11-13
    C语言二叉树 C语言二叉树的创建
  • C语言数据结构详细解析二叉树的操作
    目录二叉树分类二叉树性质性质的使用二叉树的遍历前序遍历中序遍历后序遍历层序遍历求二叉树的节点数求二叉树叶子结点个数求二叉树的最大深度二叉树的销毁二叉树分类 满二叉树 除最后一层无任何...
    99+
    2022-11-13
  • C语言二叉树的操作方法
    本篇内容主要讲解“C语言二叉树的操作方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言二叉树的操作方法”吧!二叉树分类满二叉树除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二...
    99+
    2023-06-30
  • 如何使用C语言实现平衡二叉树数据结构算法
    目录前言一、平衡二叉树实现原理二、平衡二叉树实现算法三、全部代码前言 对于一个二叉排序树而言 它们的结构都是根据了二叉树的特性从最左子树开始在回到该结点上继续往右结点走 ...
    99+
    2022-11-12
  • C语言堆与二叉树的顺序结构与实现
    目录一. 二叉树的顺序结构二. 堆的概念及结构三. 堆的实现四. 堆排序(具有缺陷型)一. 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全...
    99+
    2022-11-13
  • c语言二叉树的前序遍历方法
    这篇文章主要讲解了“c语言二叉树的前序遍历方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c语言二叉树的前序遍历方法”吧!题目给定一个二叉树,返回它的 前序 遍历。示例:输入: [1,nu...
    99+
    2023-06-19
  • Go语言数据结构之二叉树可视化详解
    目录题目源代码做题思路扩展左右并列展示上下并列展示总结回顾题目 以图形展示任意二叉树,如下图,一个中缀表达式表示的二叉树:3.14*r²*h/3 源代码 package ...
    99+
    2022-11-11
  • C语言二叉树的链式存储结构是怎样的
    本文小编为大家详细介绍“C语言二叉树的链式存储结构是怎样的”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言二叉树的链式存储结构是怎样的”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。二叉树的链式存储结构是指用...
    99+
    2023-06-29
  • Go语言数据结构之二叉树必会知识点总结
    目录前言二叉树概念二叉树的性质创建二叉树树的遍历前序遍历(V-L-R)中序遍历(L-V-R)后序遍历(L-R-V)前言 如果你是一个开发人员,或多或少对树型结构都有一定的认识,我个人...
    99+
    2022-11-11
  • C语言数据结构二叉树之堆的实现和堆排序详解
    目录一、本章重点二、堆2.1堆的介绍2.2堆的接口实现三、堆排序一、本章重点 堆的介绍堆的接口实现堆排序 二、堆 2.1堆的介绍 一般来说,堆在物理结构上是连续的数组结构,在逻辑结构...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作