【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
二叉树结点的结构体
包含指向左右子树的指针,和一个数据
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语言实现相关推荐
- 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)
前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...
- 105从前序与中序遍历序列构造二叉树 106 从中序与后序遍历序列构造二叉树 (递归 + 哈希)
引言 这两道题主要是考察二叉树遍历的掌握,即由前序和中序推出原二叉树,由后序和中序推出原二叉树,这里先来说一下推导过程: 前序和中序 知道前序遍历和中序遍历,如何推原二叉树?(直接是结论,可以自行推导 ...
- 二叉树前序、中序和后序遍历的非递归实现
1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...
- 【LeetCode笔记】94 144 145. 二叉树的前序、中序、后序遍历的迭代与递归(Java、dfs、迭代)
文章目录 一. 题目描述 二. 代码 & 思路 1. 递归的写法 2. 迭代的写法(本文重点来了) 1) 前序 2) 中序 3) 后序 直接来个整合吧,也方便看.之前只写了递归的,现在补上迭代 ...
- LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)
二叉树的前序.中序.后序.层序遍历(递归,迭代,栈,队列) 1. 二叉树的前序遍历 1.1 题目描述 1.2 题目分析 1.3 Python实现 2. 二叉树的中序遍历 2.1 题目描述 2.2 题目 ...
- 二叉树的前序、中序、后序、递归以及非递归遍历
定义节点: public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; } } Lee ...
- 非递归实现二叉树的前序、中序、后序遍历
目录 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 根据二叉树的前序和中序遍历结果还原二叉树 根据二叉树的中序和后序遍历结果还原二叉树 非递归遍历需要借助栈. 非 ...
- C++实现递归,非递归遍历二叉树(前序,中序,后序)
初学二叉树那会儿,始终掌握不好二叉树的遍历方法,更认为非递归遍历晦涩难懂没有掌握的意义.实际上非递归的遍历方法很有用处,由于每次递归都需要将函数的信息入栈,当递归层数太深很容易就导致栈溢出,所以这个时 ...
- 二叉树的前序、中序、后序遍历(递归、非递归写法)
文章目录 一.什么是二叉树? 二.二叉树的基本概念 三.二叉树的三种遍历方式 1.前序遍历(preordertraversal) 1.中序遍历(inordertraversal) 1.后序遍历(pos ...
- Python 递归式实现二叉树前序、中序、后序遍历
记忆点: 前序:VLR 中序:LVR 后序:LRV 举例: 一颗二叉树如下图所示 则它的前序.中序.后序遍历流程如下图所示 前序遍历 class Solution:def preorderTraver ...
最新文章
- 数字图像处理目录列表
- exchange2013警告The maximum number of concurrent connections has exceeded a limit
- RPMB原理介绍【转】
- 思考:日期类型的数据应该用什么样的具体形式存储到数据库?
- jquery中的ready函数与window.onload谁先执行
- python与财务工作总结_Python小结1
- 阿里云轻量级服务器上JDK及tomcat部署配置
- TypeScript:对象
- 【转】:localStorage使用总结
- Mac OS使用技巧之四:修改打开不同格式视频的默认播放器
- Django博客项目实战
- UOS 下wine的记录
- 你都为美白缴过哪些智商税? | Alfred数据室
- VGL与中国海洋石油签署液化天然气购销协议;徐工汉云打造国内首个智能化剥片机组 | 能动...
- Spire.Doc利用word样式读取word文字内容(.NET)
- 五一游天坛,体验超震撼的大像素全景
- 操作系统 --cpu与指令集
- 根据模板生成word文档下载
- 【Kay】Java的一些Bonus
- mastercam2017后处理升级_如何升级Mastercam 9.1版后处理?