二叉树基本操作

2023-11-09

定义结构体:

typedef int BTDatatype;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode *left;
	struct BinaryTreeNode *right;
	BTDatatype data;
}BTNode;

前序构建二叉树的结点;

前序遍历二叉树;

中序遍历二叉树;

后序遍历二叉树;

求二叉树的结点,叶子节点,第K层结点数,查找结点,树的深度。

对于上列问题,都可以用递归求解,因为一棵非空二叉树都有一个根,一个左子树,一个右子树。对于这种特性,可以将问题化为子问题。

前序遍历二叉树画图说明:


代码如下:

int BTreeDepth(BTNode *root)//求树的深度
{
	if (root == NULL)
		return 0;
	//将问题化为子问题,求树的高度也就是求左子树高度和右子树高度最大值
	if (BTreeDepth(root->left) > BTreeDepth(root->right))
		return  BTreeDepth(root->left)+1;
	else   //如果相等,也可以返回右子树高度
		return  BTreeDepth(root->right)+1;
}
BTNode *BTreeFind2(BTNode *root, BTDatatype x)//查找结点
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;
	BTNode *ret = NULL;
	ret = BTreeFind2(root->left, x);
	if (ret)//在左边找到,就不用在右结点找,直接返回
		return ret;
	//在左边没有找到
	ret= BTreeFind2(root->right, x);
	if (ret)//在右边找到
		return ret;
	else   //如果在一颗树的右边没有找到,那这棵树就没有该节点,就可以返回
		return NULL;
}
BTNode *ret = NULL;
BTNode *BTreeFind1(BTNode *root, BTDatatype x)//查找结点
{
	if ((root) == NULL)
		return NULL ;
	if (root->data == x)
		 ret=root;
	//查找左子树和右字树
	else {
		BTreeFind1(root->left,x);
		BTreeFind1(root->right, x);
	}
	return ret;
}
int BTreeKLevelsize(BTNode *root, int k)//求第k层结点数
{
	//求解二叉树第K层节点数目,使用递归解法,
	//第k层的节点数 = 第k - 1层左孩子节点数 + 第k - 1层右孩子节点数目,
	//直到k == 1时,说明已经到了第K层。
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return  BTreeKLevelsize(root->left, k -1) + BTreeKLevelsize(root->right, k - 1);
}
int BTtreeLeafSize(BTNode *root)//树叶子结点数
{
	if (root == NULL)
		return 0;
	if (root->left == NULL&&root->right == NULL)
		return 1;
	return BTtreeLeafSize(root->left) + BTtreeLeafSize(root->right);
}

int  BTtreeSize(BTNode *root)//树一共结点数
{//将问题化为子问题,结点数等于1+左子树结点数+右子树结点数
	if (root == NULL)
		return 0;
	return 1 + BTtreeSize(root->left) + BTtreeSize(root->right);
}
void BTtreePostOreder(BTNode *root)//后根遍历
{
	if (root)
	{
		BTtreePostOreder(root->left);
		BTtreePostOreder(root->right);
		printf("%d ", root->data);
	}
	return;
}
void BTtreeInOreder(BTNode *root)//中根遍历
{
	if (root)
	{
		BTtreeInOreder(root->left);
		printf("%d ", root->data);
		BTtreeInOreder(root->right);
	}
	return;
}
void BTtreePrevOreder(BTNode *root)//前序遍历
{
	if (root)
	{
		printf("%d ", root->data);
		BTtreePrevOreder(root->left);
		BTtreePrevOreder(root->right);
	}
	return;
}
BTNode *BuyBTNode(BTDatatype x)//构建树的结点
{
	BTNode *tree = (BTNode *)malloc(sizeof(BTNode));
	tree->data = x;
	tree->left = NULL;
	tree->right = NULL;
	return tree;
}
BTNode *CreateBTTree(BTDatatype *a, int sz, int *pIndex, BTDatatype invalid)
{//invalid代表表示空的字符
	assert(a);
	BTNode *root = NULL;
	if ((*pIndex) < sz)
	{
		if (a[*pIndex] != invalid)
		{
			root = BuyBTNode(a[*pIndex]);
			(*pIndex)++;
			root->left = CreateBTTree(a, sz, pIndex, invalid);
			(*pIndex)++;
			root->right = CreateBTTree(a, sz, pIndex, invalid);
		}
	}
	return root;
}
void TestBinaryTree(){
	BTNode *root = NULL;
	BTDatatype a[] = { 1,2,3,'#',4,'#','#',5,6,'#','#','#' };
	int pIndex = 0;
	int sz = sizeof(a) / sizeof(a[0]);
	root = CreateBTTree(a, sz, &pIndex, '#');
	BTtreePrevOreder(root);//前序
	printf("\n");
	BTtreeInOreder(root);//中序
	printf("\n");
	BTtreePostOreder(root);//后序
	printf("\n");
	printf("树的结点数:%d\n", BTtreeSize(root));//树的结点数
	printf("树的叶子结点数:%d\n", BTtreeLeafSize(root));//树叶子结点数
	int k = 4;
	printf("第%d层结点数:%d\n", k,BTreeKLevelsize(root, k));//求第k层结点数
	printf("%d\n", BTreeFind1(root, 6)->data);//查找结点
	printf("%d\n", BTreeFind2(root, 3)->data);//查找结点
	printf("%d\n", BTreeFind2(root, 4)->data);//查找结点
	printf("树的高度:%d\n",BTreeDepth(root));}








本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树基本操作 的相关文章

  • 前端优秀插件网站汇总整理——轻松建站。。。

    1 Amaze Ui 妹子UI 中国首个html5跨屏前端框架 http amazeui org 2 WebUploader 一个简单的以HTML5为主 FLASH为辅的现代文件上传组件 http fex baidu com webuplo
  • <python爬虫之JS逆向实例-1>新浪网

    声明 本文只作学习研究 禁止用于非法用途 否则后果自负 如有侵犯了您的合法权益 请告知 我将及时更正 删除 谢谢 邮箱地址 lc1139411732 163 com 文章目录 一 项目准备 二 参数分析 三 静态调试 四 动态调试 五 堆栈

随机推荐

  • yml连接两个mysql数据库_SpringBoot 多数据源配置/连接两个数据库 (SpringBoot+Mysql+SqlServer)(亲测可用)...

    Boot项目原配Mysql数据库 业务需要加上sqlserver数据库 网上看了两天 趟了不少坑 其实网上帖子挺全的 我遇到的问题没有太多相关介绍 现在搞好后分享给大家 自己也做个记录 1 首先 依赖配置 按需配置重点是数据库jar包跟bo
  • 攻防世界-lottery

    得到flag要 9990000 通过抽奖的方式获得钱 基本要7个数字都相同 扫目录 依次点开 robots txt中有 git 用git下载 或者直接下载附件1 源码 然后打开api php API Application Programm
  • 使用selenium+Edge进行浏览器不显示图片操作(屏蔽图片)

    使用Edge不加载图片进行 from msedge selenium tools import Edge EdgeOptions Edge options EdgeOptions 很关键的一步 只有为True才能进行ADD Edge opt
  • LeetCode 1143. 最长公共子序列(C++)

    题目地址 力扣 题目难度 Medium 涉及知识点 动态规划 字符串匹配 分析 由于子序列不同于子串 子串必须要连续 而子序列可以不连续 假设最长子序列长度为k 那么我们如果要通过遍历的方法来暴力求解 其时间复杂度至少为O 这肯定是无法接受
  • 【华为OD机试 2023】最左侧冗余覆盖子串(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • (fastjson)java 如何将String(字符串)与JSON互转

    一 导入依赖
  • Apple的示例SpeakHere不能运行解决

    From your error message Application windows are expected to have a root view controller at the end of application launch
  • 论文写作记录

    论文画图 在MATLAB中导出600dpi图像 导出设置dpi后 导出tif格式的图片 直接重命名为jpg格式
  • 从分层架构到微服务架构(五)之服务化架构

    从分层架构到微服务架构 是一系列介绍 Fundamentals of Software Architecture 中提到的8种架构模式的文章 这里不会事无巨细地介绍所有的细节 而是会挑选其中关键内容 更多详情请阅读原书 往期精彩 从分层架构
  • 静态的main方法为啥可以访问非静态成员

    首先第一点 静态方法中可以创建动态变量和方法 第二点 对象属于动态的 第三点 动态的可以调用调用静态的 综上 所以要在静态方法里面调用动态参数和动态的方法就可以通过创建对象来实现调用动态参数和动态的方法 https www bilibili
  • SpringBoot如何使用JDBC操作数据库呢?

    转自 SpringBoot如何使用JDBC操作数据库呢 下文笔者讲述SpringBoot中使用jdbc操作数据库的方法分享 如下所示 实现思路 1 引入相应的jar包 2 在application yml配置相应的数据库连接信息及其它属性
  • Qt 平台在windows下配置CGAL

    首先我用的平台和库的版本是 Qt Creator 2 5 0 Qt 4 8 2 CGAL 4 1 Boost1 15 CMake2 8 8 一 名词解释 1 CGAL Computational Geometry Algorithm Lib
  • 转】PPT带备注演示(只有讲解者看到备注)[转载]

    带备注演示 讲解者可以看到备注 观众看不到 想实现PPT带备注的演示吗 这种方式只有讲解者自己能够看到备注内容 而观 看PPT演示的人看不见 如下 图所示 要实现这种放映方式只需要简单的两步 1 第一步设置多显示器 在Windows XP中
  • 利用RMI实现在多台服务器之间的资源共享

    RMI Remote Method Invocation RMI是分布式对象软件包 它简化了在多台计算机上的JAVA应用之间的通信 JDK1 2以上都支持这个功能 有了RMI就可以实现不同服务器之间的通信 也就是多个JVM Java Vir
  • Lumerical学习之代码实现材料颜色与透明度的改变

    为了在仿真设计的时候让器件显得更有层次感 方便判断器件结构的各个部位 需要给材料设置合理的颜色和透明度 虽然可以在菜单栏的Material中直接调整材料颜色 但若是代码实现的话一方面可以重复利用 避免换个工程就在菜单栏重新设置 一方面也是给
  • 算法,CS学习,嵌入式学习,算法刷图,推荐资料,直接下载

    目录 附 算法代码库 附 CS 综合学习类 附 嵌入式 综合学习类 附 算法刷题总结 数据结构与算法简述和CS综述整理 本文非基础的教程 本文会列出大量学习和参考网站 老惯例 一个文章是一个集大成 本文借助了语音输入 PC 版 讯飞输入法
  • Spring Boot(二)配置一个阿里云的镜像

    1 新建项目 从中央仓库下载 太慢了 配置一个阿里云的镜像 1 从maven官网中下载apache maven 3 6 3 2 配置环境变量 添加path 3 验证 4 配置localRepository 新建文件夹 repo 用来存放从中
  • jQuery empty() VS remove()

    empty 和 remove的区别 empty remove empty empty 是移除被选元素的所有子节点 不包括自身 例子
  • c++派生类构造顺序

    1 整体构造顺序 前面我们提到过 一个类在构造的时候 先会构造其成员变量 在调用自身的构造函数 对于派生类来说 除了可能有成员变量 还可能有多个基类 在初始化派生类对象时 其构造函数要负责基类与基类成员对象的构造 还要负责自己成员对象的构造
  • 二叉树基本操作

    定义结构体 typedef int BTDatatype typedef struct BinaryTreeNode struct BinaryTreeNode left struct BinaryTreeNode right BTData