首页
学习
活动
专区
工具
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

15410
  • 函数递归【C语言】

    什么是递归 递归是学习C语言函数绕不开的一个话题,那什么是递归呢? 递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。...写一个史上最简单的C语言递归代码: #include int main() { printf("hehe\n"); main();//main函数中又调用了main函数 return...那我们假设想写一个函数Print来打印n的每一位,如下表示: Print(n) 如果n是1234,那表⽰为 Print(1234) //打印1234的每一位 其中1234中的4可以通过%10得到...在C语言中每一次函数调用,都需要为本次函数调用在内存的栈区,申请一块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧。...函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。

    8210

    【C语言】函数递归

    递归 递归是学习C语言函数绕不开的一个话题,那什么是递归呢? 递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。...写一个史上最简单的C语言递归代码: #include int main() { printf("hehe\n"); main();//main函数中⼜调⽤了main函数 return...,那我们假设想写一个函数Print来打印n的每一位,如下表示: Print(n) 如果n是1234,那表⽰为 Print(1234) //打印1234的每⼀位 其中1234中的4可以通过%10得到,那么...在C语言中每一次函数调用,都要需要为本次函数调用在栈区申请一块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧。...函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。

    11310

    【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

    10510

    C语言中的函数递归

    C语言中的函数递归 函数递归 C语言中的函数递归 什么是递归 递归必须注意的事 递归练习题 1接受一个整型(无符号),按顺序打印每一位 2用递归求n的k次方 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递归可能会导致函数的计算可能会变多如斐波那契数列的计算

    11510

    【C语言系列】函数递归

    一、递归是什么?递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。...1.1尾递归尾递归是指一个递归函数在调用自身时,该递归调用是函数的最后一条语句。换句话说,函数在调用自身之后不再执行任何操作,而是直接返回递归调用的结果。这种特殊形式的递归称为尾递归。...在C语言中每⼀次函数调用,都要需要为本次函数调用在栈区申请⼀块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧。...函数不返回,函数对应的栈帧空间就⼀直占用,所以如果函数调用中存在递归调用的话,每⼀次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。...4.1举例三:求第n个斐波那契数计算第n个斐波那契数,是不适合使用递归求解的,但是斐波那契数的问题通过是使用递归的形式描述的,如下:看到上图我们就会想到用递归的形式去做,如下代码:#include <stdio.h

    10610

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

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

    7010

    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; } } 更多的关于函数递归的例题请见下一篇

    83930

    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; } */

    67220

    C语言--函数递归与迭代

    递归在书写的时候,有两个必要条件: 1.递归存在限制条件,但凡满足这个限制条件时,递归便不再继续 2.每次递归调用之后越来越接近这个限制条件 递归的思想: 把大事化小事 递归其实就是函数自己调用自己 /...,一直打印hehe 总而言之,在函数中再次调用自己就是递归 如果递归无限的递归下去,就会出现这样的错误,栈溢出 // 每一次函数调用,都要为这次函数调用分配内存空间是内存的栈区上分配的, 如果无限的递归调用函数...(n)来表示, 当n>2的时候,Fib(n)=Fib(n-1)+Fib(n-2) //求第n个斐波那契数 //若果求第n个斐波那契数列,用Fib(n)来表示, // //当n > 2的时候,Fib(n)...,就会出现这样的错误,栈溢出 // 每一次函数调用,都要为这次函数调用分配内存空间是内存的栈区上分配的, 如果无限的递归调用函数,就会将栈区空间使用完, 就会出现栈溢出的现象 //递归---求n的阶乘...(n)来表示, 当n>2的时候,Fib(n)=Fib(n-1)+Fib(n-2) //求第n个斐波那契数 //若果求第n个斐波那契数列,用Fib(n)来表示, // //当n > 2的时候,Fib(n)

    6410

    【C语言】函数递归(超详解)

    递归是什么? 递归是学习C语⾔函数绕不开的⼀个话题,那什么是递归呢? 递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。...写⼀个史上最简单的C语⾔递归代码: #include int main() { printf("hehe\n"); main();//main函数中⼜调⽤了main函数 return...在C语⾔中每⼀次函数调⽤,都要需要为本次函数调⽤在栈区申请⼀块内存空间来保存函数调⽤期间 的各种局部变量的值,这块空间被称为运⾏时堆栈,或者函数栈帧。...函数不返回,函数对应的栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归 函数调⽤都会开辟属于⾃⼰的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。...c; n--; } return c; } 迭代的⽅式去实现这个代码,效率就要⾼出很多了。

    23300

    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; } 运行结果 改进之后发现求斐波那契数用非递归的方式效率明显高于递归的方式,原因: 避免了重复计算:递归方式在计算斐波那契数时存在着大量的重复计算...而非递归方式只需要使用有限的变量来保存中间结果,不需要额外的栈空间,节省了内存空间。 用迭代的方式去实现这个代码,效率就要高出很多了。

    98910

    【C语言】函数递归总结

    之前我总结完函数的相关知识,只差个函数递归,这篇着重讲解一下函数递归 1.什么是递归 递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。...n的阶乘的递归公式如下: 那我们就可以写出函数Fact求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶乘,函数如下: int Fact(int n) { if...在C语言中每一次函数调用,都要需要为本次函数调用在栈区申请一块内存空间来保存函数调用期间 的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧。...函数不返回,函数对应的栈帧空间就⼀直占用,所以如果函数调用中存在递归调用的话,每一次递归 函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。...所以如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起**栈溢 出(stack overflow)**的问题。

    7310

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

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

    10810

    【C语言】函数递归 (包你懂的)

    前言 在我们了解清楚函数的知识点后,我们还得认识一下函数递归。学好函数递归,也是在为我们后期提高自己代码编程的能力奠定基础。 那么,现在是侦破时间!!! 2....现在我们写一个史上最简单的C语言递归代码: #include int main() { printf("hehe\n"); main();//main函数中又调用了main函数...为了保护我们内存宝宝这颗敏感易碎的心灵,我们得给函数递归加以限制,让它达到某种我们希望的程度时就停止下来,然后得到我们想要的结果。 所以,函数的递归时必不可少的!...那么我们可以先写一个函数Print打印n的每一位,如下表示: Print(n) 如果n是1234,那表示为 Print(1234) //打印1234的每一位 其中1234中的4就可以通过%10得到,那么...这不就可以用递归实现。

    8310

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

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

    56110
    领券