首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用C语言表示二叉树的递归函数

可以通过定义一个二叉树的结构体来实现。下面是一个示例代码:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

// 定义二叉树结点的结构体
struct TreeNode {
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
};

// 递归函数:用于创建二叉树
struct TreeNode* createBinaryTree(int val) {
    struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    newNode->val = val;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 递归函数:用于插入结点到二叉树中
struct TreeNode* insertNode(struct TreeNode* root, int val) {
    if (root == NULL) {
        return createBinaryTree(val);
    }
    if (val < root->val) {
        root->left = insertNode(root->left, val);
    } else {
        root->right = insertNode(root->right, val);
    }
    return root;
}

// 递归函数:用于在二叉树中查找指定值的结点
struct TreeNode* searchNode(struct TreeNode* root, int val) {
    if (root == NULL || root->val == val) {
        return root;
    }
    if (val < root->val) {
        return searchNode(root->left, val);
    } else {
        return searchNode(root->right, val);
    }
}

// 递归函数:用于删除二叉树中指定值的结点
struct TreeNode* deleteNode(struct TreeNode* root, int val) {
    if (root == NULL) {
        return root;
    }
    if (val < root->val) {
        root->left = deleteNode(root->left, val);
    } else if (val > root->val) {
        root->right = deleteNode(root->right, val);
    } else {
        if (root->left == NULL) {
            struct TreeNode* temp = root->right;
            free(root);
            return temp;
        } else if (root->right == NULL) {
            struct TreeNode* temp = root->left;
            free(root);
            return temp;
        }
        struct TreeNode* temp = root->right;
        while (temp->left != NULL) {
            temp = temp->left;
        }
        root->val = temp->val;
        root->right = deleteNode(root->right, temp->val);
    }
    return root;
}

// 递归函数:用于销毁二叉树
void destroyBinaryTree(struct TreeNode* root) {
    if (root == NULL) {
        return;
    }
    destroyBinaryTree(root->left);
    destroyBinaryTree(root->right);
    free(root);
}

// 递归函数:用于中序遍历二叉树
void inorderTraversal(struct TreeNode* root) {
    if (root == NULL) {
        return;
    }
    inorderTraversal(root->left);
    printf("%d ", root->val);
    inorderTraversal(root->right);
}

int main() {
    struct TreeNode* root = NULL;
    root = insertNode(root, 5);
    insertNode(root, 3);
    insertNode(root, 7);
    insertNode(root, 2);
    insertNode(root, 4);
    insertNode(root, 6);
    insertNode(root, 8);

    printf("中序遍历结果:");
    inorderTraversal(root);
    printf("\n");

    struct TreeNode* searchResult = searchNode(root, 4);
    if (searchResult != NULL) {
        printf("找到了值为4的结点\n");
    } else {
        printf("未找到值为4的结点\n");
    }

    root = deleteNode(root, 5);
    printf("删除结点后的中序遍历结果:");
    inorderTraversal(root);
    printf("\n");

    destroyBinaryTree(root);
    return 0;
}

以上代码实现了用C语言表示二叉树的递归函数,包括创建二叉树、插入结点、查找结点、删除结点、销毁二叉树等功能。在主函数中,我们创建了一个二叉树并进行了中序遍历,然后查找值为4的结点并删除根结点,最后销毁二叉树。

这个递归函数的应用场景包括二叉树的构建、查找、插入、删除等操作。对于需要使用二叉树的场景,可以使用这个递归函数来方便地进行操作。

腾讯云相关产品中,与二叉树相关的产品包括云数据库 TencentDB、云函数 SCF、云存储 COS 等。具体产品介绍和链接地址可以参考腾讯云官方文档:

请注意,以上答案仅供参考,具体的产品选择和使用需根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言函数递归_c语言递归举例

大家好,我是架构君,一个会写代码吟诗架构师。今天说一说C语言函数递归_c语言递归举例,希望能够帮助大家进步!!! 文章目录 函数递归 什么是递归?...递归俩个必要条件 代码引例1 栈溢出(Stack Overflow) 合理使用递归 代码引例3 代码引例4 解释要合理使用递归 结束语 函数递归 程序调用自身编程技巧称为递归 recursion)...第一次接触递归都会很懵,慢慢理解这个过程就明白了。 什么是递归递归做为一种算法在程序设计语言中广泛应用。...所以遇到问题时,我们应该明白是要把问题简单化,而不是习惯用递归,就一直递归思考问题 我们应该清楚是不是递归思想会比较简单,或者换成递归思想也可以实现,我们可以通过例题明白 代码引例3 求n阶乘...当一个问题相当复杂,难以迭代实现时,此时递归实现简洁性便可以补偿它所带来运行时开销 结束语 本人是学c小白,这些是近期学习整理总结,有什么不对欢迎大家指正,我会继续努力,谢谢~!

13.7K32

C语言函数递归

一、什么是递归 递归式一种解决问题方法,在C语言中,递归就是自己调用自己。...函数不返回,函数对应栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归 函数调⽤都会开辟属于⾃⼰栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。      ...2个函数 void Move(char a, char b, int n) { //n代表第几个圆盘,a和b穿得是柱子编号,表示从a柱子挪到b柱子 printf("第%d个圆盘从%c柱挪动到%c柱...\n", n, a, b); } void Hanoi(char a, char b, char c, int n) //a表示圆盘所在柱子,b表示移动圆盘辅助柱子,c表示圆盘目标柱子,n表示圆盘个数...,b表示移动圆盘辅助柱子,c表示圆盘目标柱子,n表示圆盘个数 { assert(n > 0); if (n == 1) Move(a, c, n);//将圆盘直接移动到c上 else

12710
  • C语言函数函数递归

    ###"; strcpy(arr2, arr1); printf("%s\n",arr2); return 0; } 2. memset函数 ‘ * '代替arr...2.1 实际参数(实参) 真实传给函数参数,叫实参 2.2 形式参数(形参) 形式参数是指函数名后括号中变量,因为形式参数只有在函数被调用过程中才实例化(分配内 存单元),所以叫形式参数。...但是具体是不是存在,函数 声明决定不了。 函数声明一般出现在函数使用之前。要满足先声明后使用。 函数声明一般要放在头文件中。...3.2 函数定义: 函数定义是指函数具体实现,交待函数功能实现。 四、函数递归 练习1 调用函数自己本身,例如,接受一个整型值(无符号),按照顺序打印它每一位。...; 递归方法–把大事化小,首先把字符串首地址传入函数,然后判断字符不是’ \0 '就调用函数本身 my_strlen(“bit”); 1+my_strlen(“it”); 1+1+my_strlen

    9410

    C语言函数递归

    C语言函数递归 函数递归 C语言函数递归 什么是递归 递归必须注意递归练习题 1接受一个整型(无符号),按顺序打印每一位 2递归求nk次方 3编写函数不用许创建临时变量,求字符长度 青蛙跳台阶...递归缺点 什么是递归 程序调用自生编程技巧称作递归。...%d ", n); return 0; } int main() { unsigned int a = 0; scanf("%u", &a); print(a); return 0; } 2递归求...,求字符长度 引入一个知识点,当你函数调用传送是一个数组时,数组名其实传递是数组首元素地址。...1递归会导致函数多次调用,而每次函数调用过程中都会在程序调用栈(call stack)所开辟空间,但是栈区空间是有限的当递归层次太深时就会出现栈溢出(strack overflow). 2递归可能会导致函数计算可能会变多如斐波那契数列计算

    10110

    C语言(6)----函数递归思想

    A:当一个函数不断调用自己过程也就是递归,这在这段代码中很好体现了出来。 B:每次当我们调用函数时候都会向内存栈区申请一块空间,这块空间被称为运行时堆栈,也就是函数栈帧空间。...我们就可以写一个函数: 这个函数可以清晰看出阶乘递归思想逻辑。 那么我们递归思想就可以很容易得出计算阶乘方式。...比如当我们递归思想来求斐波那契数时,函数是这么写: 先执行它: 我们任意输入一个数:n 可以发现这个数字较小时候,编译器是可以应付; 但当这个数字较大时,编译器计算速度就会显著变慢,甚至可能出现计算不出来情况...所以说白了,递归思想很简单,但它使用很死。所以这就是它缺点。 3.递归和迭代 其实不难看出,递归思想很像循环,特别是for循环,简直不能太像。 那么当我们难以递归解决高运算时,应该怎么办呢?...其实迭代就是循环意思。 在斐波那契数计算中,如果我们while循环来代替递归,是可以很快就算出结果,这是因为它没有经过一层又一层剖析,而是直接通过迭代计算出结果。

    6610

    C语言函数嵌套与递归

    函数嵌套 在C语言中,所有函数都是相互平行,且相互独立。在定义函数时,一个函数内不能再定义另一个函数,不能嵌套定义,但是可以嵌套使用。 例:编写一个求四个整数中最小值函数,并在主函数进行调用。...b:a; } 函数递归--->循环 在函数调用过程中,出现一个函数调用自己本身情况,就是在运行过程中调用自己。...函数递归有两个必要条件: 函数出口,不能无限制地调用本身,须有个出口,化简为非递归状况处理。 递推公式。...(偷懒) 递归理解方法: 例如:求1+2+3+4+...+100 #include int main(){ int sum(int n); printf("%d",...; } int sum(int n){ if(n==1){ return 1; }else{ return sum(n-1)+n; } } 更多关于函数递归例题请见下一篇

    82530

    C语言-内联函数递归函数、指针函数

    前言 这篇文章介绍C语言内联函数递归函数函数指针、指针函数、局部地址、const关键字、extern关键字等知识点;这些知识点在实际项目开发中非常常用,非常重要。...指针函数: 本身是函数表示函数返回值是指针类型。语法: int *func(int a,int b){} 函数名称就是地址。...递归函数 什么是递归函数? 子函数直接或者间接方式调用自己过程叫做递归函数自己调用自己过程—递归递归函数注意事项:必须有终止条件。...return 0; } //计算字符串长度 int func(char *p) { if(*p=='\0') { return 0; } return 1+func(p+1); } /* 演示递归函数返回过程...: a(); //3 int a() { return 1+b(); } int b() { return 1+c(); } int c() { return 1; } */

    66320

    c语言函数迭代与递归_递归与迭代

    递归子问题一定要有解。(即递归一定要有回归条件。)...递归有两个过程: 递推:层层推进,分解问题 回归:层层回归,返回较大问题递归函数缺陷: 1.对栈依赖性太高,需要耗费大量栈空间来实现递推过程 2.逻辑简单,好理解。...只要是函数,都可以自己调用自己,但是,禁止main调用main函数。(即main自己调用自己)(容易产生栈上溢。)...我们将这样算法思想称之为递归。 在C语言中,有一种函数,该函数可以在函数体中调用自己,这样函数称之为递归函数。...3.递归特点 1.解放了人 2.对栈消耗大 3.算法效率低下,不能过多层递归 4.迭代特点 1.需要人去分析迭代过程 2.减小对栈开销 3.算法效率高 5.什么时候使用递归 1.递归层次不多

    1.1K10

    C语言基础】:函数递归详解

    函数递归概念 函数递归指的是在函数内部调用自身过程。 具体而言,递归函数通过将一个问题分解为更小、类似的子问题来解决问题。 2....递归函数定义 递归函数定义通常包括以下几个要素: 基本情况(Base Case):递归函数必须包含一个或多个基本情况,即能够直接解决最简单问题。当函数达到基本情况时,递归将停止。...非递归实现 题目分析: 也可以参考上面递归实现思路,我们可以三个变量相互替换来解决,n1为第一项,n2为第二项,c为第三项,运用while()循环,每一次循环n就减1,直到n=2,最后输出c。...Fib(n); printf("%d\n", ret); return 0; } 运行结果 改进之后发现求斐波那契数递归方式效率明显高于递归方式,原因: 避免了重复计算:递归方式在计算斐波那契数时存在着大量重复计算...而非递归方式只需要使用有限变量来保存中间结果,不需要额外栈空间,节省了内存空间。 迭代方式去实现这个代码,效率就要高出很多了。

    55310

    C语言学习系列-->【函数递归

    一、概述 递归其实是⼀种解决问题⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。...递归思想就是将大事化小过程。 二、递归限制条件 由于递归函数调用自己,因此编写这样函数时很容易出错,进而导致 无限循环。...,只是将大事化小,并没有计算出结果;绿色箭头表示回归,计算结果返回上一级。...在C语⾔中每⼀次函数调⽤,都要需要为本次函数调⽤在栈区申请⼀块内存空间来保存函数调⽤期间各种局部变量值,这块空间被称为运⾏时堆栈,或者函数栈帧。...函数不返回,函数对应栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归函数调⽤都会开辟属于⾃⼰栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。

    10010

    C语言函数递归详解:理解递归原理与应用

    摘要: 本文将详细介绍C语言函数递归,包括递归原理、递归基本结构、递归应用场景以及递归注意事项。通过代码示例,帮助读者深入理解和掌握C语言函数递归概念与用法。...本文将详细介绍C语言函数递归,带你一步步了解它原理、用法以及注意事项。 二、递归原理 函数递归原理基于两个关键思想:基本情况和递归调用。...三、递归基本结构 函数递归基本结构包括两个部分:递归函数定义和递归函数调用。 1. 递归函数定义: 递归函数需要在函数体内部调用自身。函数参数和返回值可以根据具体问题进行定义。...递归函数调用: 在递归函数内部调用自身,将问题分解为更小子问题。通过递归调用,函数可以不断地向基本情况靠近,最终解决问题。...六、总结 本文详细介绍了C语言函数递归,包括递归原理、基本结构、应用场景以及注意事项。通过代码示例,希望读者能够更加深入地理解和掌握函数递归概念与用法。

    16810

    C语言】卍字通晓→函数递归

    一个较大程序一般应分为若干个程序块,每一个模块用来实现一个特定功能。所有的高级语言中都有子程序这个概念,子程序实现模块功能。 在C语言中,子程序是由一个主函数和若干个函数构成。...---- C语言函数好处  降低复杂性!函数最首要原因是为了降低程序复杂性,可以使用函数来隐含信息,从而使你不必再考虑这些信息。 避免重复代码段!...C语言函数分类 库函数 自定义函数 ---- 库函数 为什么在程序当中会存在有库函数?...函数声明组成 函数返回值类型,返回值可以是某个 C 数据类型 函数名,函数名也就是函数标识符,函数名在程序中必须是唯一。因为标识符,所以函数名也要遵守表示一个命名规程。...\n"); main(); return 0; } C语言递归是什么?不就是函数体内自身调用自己称之为递归吗。 如上述代码中可以看到,这里主函数里面有个打印库函数,其语句hello C

    74810

    C语言学习——函数(含递归

    根据(1)(2)(3)可知,逻辑上一个C语言程序是由函数构成C语言程序从主函数开始执行,在主函数中调用其他函数,这些函数可能又调用别的函数,主函数执行完毕代表整个程序结束。...,当有多个实参时,实参间“ ,”分隔 实参表求值顺序,因系统而定(Turbo C 自右向左) 调用无参函数时,实参表列为空,但( )不能省 函数调用方式 按函数在程序中出现位置,有三种调用方式...函数声明 一般形式:函数类型 函数名(形参类型 [形参名],…… ); 或 函数类型 函数名(); 作用:告诉编译系统函数类型、参数个数及类型,以便检验 C语言函数声明称为函数原型。...三、函数嵌套调用及递归调用 函数递归调用 递归:在函数调用过程中,直接或间接调用自身。...递归调用方式 直接递归调用:在函数体内又调用自身 间接递归调用:当函数1去调用另一函数2时,而另一函数2反过来又调用函数1自身。 解决无终止递归调用方法是:确定好结束递归条件。

    70710

    c语言】汉诺塔问题详解(c语言递归函数

    接下来我们就分析一下汉诺塔问题具体思路! 图解汉诺塔移动 n=3 这里可以理解为我们先将前n-1个圆盘借助C柱移到B柱,然后把最大圆盘移到C柱,然后再以同样思路执行。...n=4 当n=4时候,我们仍然可以先将前n-1个圆盘(这里即前三个圆盘)设法置于B柱(后面会讲具体操作),然后再将最大圆盘置于C柱。...问题剖析及代码实现 前n-1个圆盘移动方法 前提:有n个圆盘以从小到大顺序排在A柱上,有三个柱子,我们分别将这三个柱子记为A,B,C。...1.n为偶数时,按A->B->C->A顺序移最小圆盘,移一次;n为奇数时,按A->C->B->A顺序挪移最小圆盘,移一次; 2.接着,把另外两根柱子上可以移动圆盘移到新柱子上。...2^1-1 2 3 2^2–1 3 7 2^3-1 4 15 2^4-1 … … … n \ 2^n-1 如果我们将移动前n-1个圆盘视为Hanoi(n-1),根据上述结论,则移动n个圆盘次数可以Hanoi

    29110

    c语言函数本质和使用及递归函数

    前言 从今天开始,给大家分享c语言里面的函数本质及其使用;我估计大多读者看到这个,都认为c语言函数里面有啥可讲,其实在学习过程中千万不要小看每一个知识点,因为每一个小知识点都是给你在做项目之前打牢基础...什么方法才能实现我要功能以及这种写法怎样表示,甚至一些基础语法错误都会有(严重的话,一些最为基本错误都解决不了,发现不了。)...,归根到底还是基础不牢,其实这样做起项目来比较痛苦(不过这会让你注视到c语言功底重要性了)。好了,废话就不多说了,开始今天主题分享!...c语言函数 1 .C语言为什么会有函数: (1)整个程序分成多个源文件,一个文件分成多个函数,一个函数分成多个语句,这就是整个程序组织形式。这样组织好处在于:分化问题、便于编写程序、便于分工。...(2)函数定义是函数根本,函数定义中函数表示了这个函数在内存中首地址(函数名就是一个地址),所以可以函数名来调用执行这个函数(实质是指针解引用访问);函数定义中函数体是函数执行关键,函数将来执行时主要就是执行函数

    68360

    c语言从入门到实战——函数递归

    函数递归 前言 函数递归是指一个函数直接或间接地调用自身,以解决问题一种方法。在C语言中,函数递归可以用来计算阶乘、斐波那契数列等数学问题。...因此,在使用递归时,应仔细考虑其效率和适用性。 1. 递归是什么? 递归是学习C语言函数绕不开一个话题,那什么是递归呢? 递归其实是一种解决问题方法,在C语言中,递归就是函数自己调用自己。...写一个史上最简单C语言递归代码: #include int main() { printf("hehe\n"); main(); //main函数中又调用了main函数 return...在C语言中每一次函数调用,都要需要为本次函数调用在栈区申请一块内存空间来保存函数调用期间各种局部变量值,这块空间被称为运行时堆栈,或者函数栈帧。...递归或动态规划均可求解。

    16710
    领券