二叉树结点的结构体

包含指向左右子树的指针,和一个数据

typedef struct MyTreeNode
{struct MyTreeNode* left; //左孩子struct MyTreeNode* right; //右孩子int data;
}MyTreeNode;

创建一棵二叉树

创建一颗二叉树,其节点关系以及每个结点的数据如图所示

代码如下

{MyTreeNode t[15];for (i = 0; i < 15; i++){memset(&t[i], 0, sizeof(MyTreeNode)); //没有孩子的应指向NULLt[i].data = i + 1;}//建立关系t[0].left = &t[1];t[0].right = &t[7];t[1].left = &t[2];t[2].left = &t[3];t[2].right = &t[4];t[4].left = &t[5];t[5].right = &t[6];t[7].right = &t[8];t[8].right = &t[14];t[8].left = &t[9];t[9].left = &t[10];t[9].right = &t[11];t[11].left = &t[12];t[11].right = &t[13];
}

二叉树的前序遍历

前序遍历是指,先访问根结点,然后访问左子树根节点,然后访问右子树根结点(根-左-右)。通过递归调用实现前序遍历算法的C语言代码如下:

void preorder_traversal(MyTreeNode* tree)
{if (tree == NULL){//叶子结点指向NULL则返回return;}printf("%d ", tree->data);preorder_traversal(tree->left);preorder_traversal(tree->right);
}

前序遍历算法的测试结果:

中序遍历

先访问左子树根结点,然后访问根结点,最后访问右子树根结点(左-根-右)。通过递归调用实现中序遍历算法的C语言代码如下:

void inorder_traversal(MyTreeNode* tree)
{if (tree == NULL){return;}inorder_traversal(tree->left);printf("%d ", tree->data);inorder_traversal(tree->right);
}

中序遍历算法的测试结果:

后序遍历

先访问左子树根结点,然后访问右子树根结点,最后访问根结点(左-右-根)。通过递归调用实现后序遍历算法的C语言代码如下:

void postorder_traversal(MyTreeNode* tree)
{if (tree == NULL){return;}postorder_traversal(tree->left);postorder_traversal(tree->right);printf("%d ", tree->data);
}

后序遍历算法的测试结果:

三种遍历的关系

通过对比三种递归遍历算法的代码可以看到,三种遍历的区别就在于printf函数的位置不同,其他语句的顺序都是相同的,实际上,在遍历树的时候,不管是前序遍历、中序遍历、还是后序遍历,每个结点都会被访问三次,如下图所示,三种遍历的区别就在于获取节点数据的时机不同,前序遍历是在第一次访问就获取结点数据,中序遍历是在第二次访问的时候获取结点数据,后序遍历是在第三次访问的时候获取结点数据。

求二叉树的叶子结点数

代码如下

void get_leaf_num(MyTreeNode* tree, int* count) //指针做函数参数,间接修改实参的值
{if ((tree->left == NULL) && (tree->right == NULL)){(*count)++;}if (tree->left != NULL){get_leaf_num(tree->left, count);}if (tree->right != NULL){get_leaf_num(tree->right, count);}
}

求二叉树叶子结点算法测试:

复制一棵树

通过递归实现复制树,代码如下

MyTreeNode* copy_tree(MyTreeNode* tree)
{MyTreeNode* root = NULL;// *left = NULL, * right = NULL;root = (MyTreeNode*)malloc(sizeof(MyTreeNode));memset(root, 0, sizeof(MyTreeNode));root->data = tree->data;if (tree->left != NULL){//如果有左子树则复制左子树root->left = copy_tree(tree->left);}else{//没有左子树则置为NULLroot->left = NULL;}if (tree->right != NULL){root->right = copy_tree(tree->right);}else{root->right = NULL;}return root;
}

复制树的时候,要通过malloc动态为复制好的树的结点分配内存,最后返回树的根结点地址。算法测试结果如下:

【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现相关推荐

  1. 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)

    前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...

  2. 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)

    引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...

  3. 二叉树前序、中序和后序遍历的非递归实现

    1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...

  4. 【LeetCode笔记】94 144 145. 二叉树的前序、中序、后序遍历的迭代与递归(Java、dfs、迭代)

    文章目录 一. 题目描述 二. 代码 & 思路 1. 递归的写法 2. 迭代的写法(本文重点来了) 1) 前序 2) 中序 3) 后序 直接来个整合吧,也方便看.之前只写了递归的,现在补上迭代 ...

  5. LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)

    二叉树的前序.中序.后序.层序遍历(递归,迭代,栈,队列) 1. 二叉树的前序遍历 1.1 题目描述 1.2 题目分析 1.3 Python实现 2. 二叉树的中序遍历 2.1 题目描述 2.2 题目 ...

  6. 二叉树的前序、中序、后序、递归以及非递归遍历

    定义节点: public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; } } Lee ...

  7. 非递归实现二叉树的前序、中序、后序遍历

    目录 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 根据二叉树的前序和中序遍历结果还原二叉树 根据二叉树的中序和后序遍历结果还原二叉树 非递归遍历需要借助栈. 非 ...

  8. C++实现递归,非递归遍历二叉树(前序,中序,后序)

    初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义.实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时 ...

  9. 二叉树的前序、中序、后序遍历(递归、非递归写法)

    文章目录 一.什么是二叉树? 二.二叉树的基本概念 三.二叉树的三种遍历方式 1.前序遍历(preordertraversal) 1.中序遍历(inordertraversal) 1.后序遍历(pos ...

  10. Python 递归式实现二叉树前序、中序、后序遍历

    记忆点: 前序:VLR 中序:LVR 后序:LRV 举例: 一颗二叉树如下图所示 则它的前序.中序.后序遍历流程如下图所示 前序遍历 class Solution:def preorderTraver ...

最新文章

  1. 数字图像处理目录列表
  2. exchange2013警告The maximum number of concurrent connections has exceeded a limit
  3. RPMB原理介绍【转】
  4. 思考:日期类型的数据应该用什么样的具体形式存储到数据库?
  5. jquery中的ready函数与window.onload谁先执行
  6. python与财务工作总结_Python小结1
  7. 阿里云轻量级服务器上JDK及tomcat部署配置
  8. TypeScript:对象
  9. 【转】:localStorage使用总结
  10. Mac OS使用技巧之四:修改打开不同格式视频的默认播放器
  11. Django博客项目实战
  12. UOS 下wine的记录
  13. 你都为美白缴过哪些智商税? | Alfred数据室
  14. VGL与中国海洋石油签署液化天然气购销协议;徐工汉云打造国内首个智能化剥片机组 | 能动...
  15. Spire.Doc利用word样式读取word文字内容(.NET)
  16. 五一游天坛,体验超震撼的大像素全景
  17. 操作系统 --cpu与指令集
  18. 根据模板生成word文档下载
  19. 【Kay】Java的一些Bonus
  20. mastercam2017后处理升级_如何升级Mastercam 9.1版后处理?

热门文章

  1. 5分钟在大米云上基于WordPress搭建一个博客
  2. 算法快学笔记(十五):贪婪算法与NP完全问题
  3. LMDB:闪电内存映射数据库管理器
  4. oracle imp导入dmp文件流程
  5. 电子秤查看通道及更改通道方法
  6. 计算机二级c语言考试题型及分值,全国计算机二级C语言考试题型及考试重点
  7. 联合概率分布、边缘概率分布
  8. CFA2019notes的PDF版本,热乎乎的百度网盘分享
  9. Tesseract-OCR4.0识别中文与训练字库实例
  10. CAN BusOff相关知识点