c/c++实现二叉树的一些基本操作

数据结构-线索二叉树基本操作源代码(C/C++实现) 数据结构-线索二叉树基本操作源代码(C/C++实现) 关键点理解 中序遍历有隔一个结点为一个叶子结点的特点–>叶子结点孩子指针为NULL—>利用起来,叶子结点左边域空间方指向前驱结点,前驱结点若无右孩子结点,则前驱结点的右孩子指针域指向当前结点 当真不知道是哪个个鬼才发明的结构…光理解就要好半天 源代码 #include "string.h" #include "stdio.h" ... 阅读详情

**刚学到数据结构的二叉树时,总结了下它的一些基本操作,构建、遍历以及一些简单计算很多都基于递归思想,也就是递归栈的思想,如果一开始觉得难理解,可以试着画画图,从栈的特性去理解

接下来贴出代码

typedef struct BinaryTree
{
	int data;
	BinaryTree *Left, *Right; 
}Node;

//先创建根节点,然后创建左结点,直到左节点为叶子结点(其接下来的左右子树都为0)
//这个时候再创建右结点,以此类推
Node* createBinaryTree(){
	Node *p; 
	int ch;
	cin >> ch;
	if (ch == 0) {   //如果到了叶子结点,左、右子树赋值为0
		p = NULL;
	}
	else {
		p = (Node*)malloc(sizeof(Node));        //创建根结点,并赋值
		p->data = ch;
		printf("请输入%d结点的左子结点: ", p->data);
		p->Left = createBinaryTree();     //递归创建左子树
		printf("请输入%d结点的右子结点: ", p->data);
		p->Right = createBinaryTree();    //递归创建右子树
	}
	return p;
}
//释放二叉树空间
void DestroyTree(Node* root) {
	if (root == NULL) {
		return;
	}
	else {
		DestroyTree(root->Left);
		DestroyTree(root->Right);
		free(root);
	}
}
//前序遍历,先根节点,后同级先左后右
void preOrderTraverse(Node* root) {
	if (root) {
		cout << root->data << ' ';
		preOrderTraverse(root->Left);
		preOrderTraverse(root->Right);
	}
}
//中序遍历,左->根->右
void inOrderTraverse(Node* root) {
	if (root) {
		inOrderTraverse(root->Left);
		cout << root->data << ' ';
		inOrderTraverse(root->Right);
	}
}
//后序遍历,左->右->根
void lastOrderTraverse(Node* root) {
	if (root)
	{
		lastOrderTraverse(root->Left);
		lastOrderTraverse(root->Right);
		cout << root->data << ' ';
	}
}

int leaf_num(Node *root) {      //叶子结点个数
	if (!root) {
		return 0;
	}
	else if (root->Left == NULL && root->Right == NULL) {
		return 1;
	}
	else {
		return (leaf_num(root->Left) + leaf_num(root->Right));
	}
}

int Node_num(Node *root) {            //结点个数
	if (root == NULL) {
		return 0;
	}
	else {
		return 1 + Node_num(root->Left) + Node_num(root->Right);  
	}
}

int tree_Depth(Node *root) {      //二叉树深度
	if (root) {
		return tree_Depth(root->Left) > tree_Depth(root->Right)
			? tree_Depth(root->Left) + 1 : tree_Depth(root->Right) + 1;
	}
	if (root == NULL) {
		return 0;
	}
}

void MIRROR(Node *p) {   //二叉树的镜像
	if (p == NULL || (p->Left == NULL && p->Right == NULL)) {  //根结点为空或者不存在左右子树时,不需要翻转
		return;
	}

	//左右子树交换
	Node *temp = p->Left; 
	p->Left = p->Right;
	p->Right = temp;

	MIRROR(p->Left);  //翻转左子树
	MIRROR(p->Right); //翻转右子树
	return;
}

int main() {
	cout << "请输入二叉树的根节点: ";
	Node *p = createBinaryTree();

	cout << endl << "前序遍历:" << endl;
	preOrderTraverse(p);

	cout << endl << "中序遍历:" << endl;
	inOrderTraverse(p);

	cout << endl << "后序遍历:" << endl;
	lastOrderTraverse(p);

	cout << endl << endl << "结点个数: " << Node_num(p) << endl
		 << "叶子结点个数: " << leaf_num(p) << endl << "二叉树深度: " << tree_Depth(p)
		 << endl;
		
	MIRROR(p);  //进行二叉树镜像
	cout << endl << "二叉树镜像后进行前序遍历: ";
	preOrderTraverse(p);
	
	system("pause");
	return 0;
}

运行实现效果:

实现这个二叉树

AUTO-DL平台快速部署BEVFormer:Nuscenes数据集完整训练避坑指南 本文详细介绍了在AUTO-DL平台高效部署BEVFormer模型并利用Nuscenes数据集进行完整训练的实战指南。重点解析了平台数据管理、环境配置、数据集迁移解压、预处理及训练启动等全流程中的关键步骤与常见避坑技巧,帮助研究者和工程师快速复现这一前沿视觉感知模型,节省云端训练时间与成本。 阅读详情

相关推荐

Mem0 vs LangMem vs Letta:三大AI记忆框架实战对比(附代码示例)

本文深入对比了Mem0、LangMem和Letta三大AI记忆框架的核心特性与适用场景。Mem0提供开箱即用的记忆管理服务,适合快速集成;LangMem深度融入LangGraph生态,适合复杂工作流;Letta则采用虚拟内存系统,旨在突破上下文窗口限制。文章通过实战代码示例,为开发者选择适合其业务需求的AI记忆解决方案提供了清晰指南。

g9h0i1的博客 679

数据结构C++——二叉树的实现

二叉树的实现 计算二叉树深度方法 计算二叉树结点个数方法:(R+L+D=结点个数) 计算叶子结点的个数方法

m0_63064861的博客 1806

3款 433MHz 收发模块对比:SYN480R vs RXB6 vs DL-TX19,实测卷帘门遥控距离

本文深度评测了3款433MHz收发模块SYN480R、RXB6与DL-TX19在卷帘门遥控距离、穿透性能和抗干扰能力等方面的表现。通过实测数据对比,分析了超外差、超再生和PLL锁相环技术的优劣,为智能家居和工业控制领域的无线遥控方案选型提供专业参考。

weixin_30700977的博客 393

C++实现树 - 02 二叉树

写在前面: 这一讲我们来看看二叉树的实现,还不清楚树的结构的小伙伴建议先看看上面一讲关于树的定义。 二叉树的定义 二叉树是每个结点最多有两个子树的树结构。也就是说二叉树不允许存在度大于2的树。它有五种最基本的形态:二叉树可以是空集。根可以有空的左自树或者右子树;或者左右子树都是空。其中只有左子树或者右子树的叫做斜树。 二叉树的主要性质 性质 结论 性质一 在二叉树的 i 层上至多有 2 ^ ( i - 1 ) 个结点( i >= 1 ) 性质二 深度为 k 的二叉树至多有 2.

Newin2020的博客 6750

基于Q-learning的无人机三维路径规划(含完整C++代码)

基于Q-learning的无人机三维路径规划(含完整C++代码)

weixin_54186646的博客 1万+

Delphi开发者必备:CEF4Delphi跨平台浏览器嵌入实战指南(含Lazarus适配)

本文详细介绍了Delphi开发者如何利用CEF4Delphi实现跨平台浏览器嵌入,包括环境配置、Lazarus适配、ARM架构优化及Firemonkey集成等实战技巧。通过Chromium引擎的强大功能,开发者可以轻松为传统桌面应用添加现代浏览器特性,提升多平台开发效率。

weixin_29233333的博客 226

二叉树的使用方法

转载: http://blog.jobbole.com/108184/ https://blog.youkuaiyun.com/zhanggonglalala/article/details/79738213 https://blog.youkuaiyun.com/heyanxi0101/article/details/79593542 一、概述 平衡树:所有结点左右子树深度差≤1 排序树:所有结点“左小右大 字典树:由...

qq_30534935的博客 1494

YOLO26改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLO26-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 900

二叉树的详细实现 (C++)

二叉树的定义 以递归形式给出的:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。二又树的特点是每个结点最多有两个子女,分别称为该结点的左子女和右子女。在二又树中不存在度大于2的结点,并且二又树的子树有左、右之分,其子树的次序不能颠倒。二又树是分支数最大不超过2的有根有序树。它可能有5种不同的形态。 ...

dielu7895的博客 2541

化工设备设计软件:PVELITE二次开发_(12).数据导入导出与兼容性

在数据导入之前,需要定义数据在PVELITE中的结构。可以通过编程接口定义字段名称和数据类型。# 导入必要的库 import pvelite # 创建PVELITE实例 pve = pvelite . PVELITE() # 定义CSV数据结构 csv_structure = {

kkchenjj的博客 1212

innovus:给channel加soft blockage

dbGet [dbGet top.fplan.pBlkgs.name finishfp_place_blkg_* -p].boxes就可以获得channel坐标。意思是给30um以下的channel加soft blk,至于channel的坐标,通过抓取该soft blk去获取,比较容易。工具自己加入的placement blockage命名上叫finishfp_place_blkg_*ICC2中有给channel自动加soft blockage的命令,相应的innovus也有类似的命令,我们可以使用。

m0_61544122的博客 480

c++二叉树详解(附基本操作代码版)

二叉树可以说是树形数据结构中最基础的,且在多种领域都有应用(比如语法树,二值决策树),熟悉其各种操作是必须的。char data;}BT;// 根据输入二点中序表达式和前序表达式创建一颗二叉树// 展示一颗二叉树,以A(B, C(D, E))这样加了括号的前序遍历来实现// 销毁二叉树// 判断这颗树是不是完全二叉树// 计算树的高度// 计算叶子的数量// 计算树的宽度// 层次遍历// 前序遍历// 中序遍历// 后序遍历。

浪子回头 7446

大厂校招:星宸科技嵌入式面试及参考答案(5万字长文)

当一个新的硬件设备被插入系统时,内核会发送一个设备事件通知 udev,udev 会根据设备的属性和规则,为该设备创建一个合适的设备文件。通过去除不必要的驱动程序、禁用不需要的功能、选择合适的内核配置选项、优化内核编译选项和定制内核模块等方法,可以减小内核的大小和复杂性,提高系统的性能和稳定性。上半部通常是在中断关闭的情况下执行的,以确保中断处理的原子性。处理碎片化内存是内存管理中的一个重要问题,可以采用内存压缩、内存池管理、伙伴系统、首次适应算法和最佳适应算法等方法来减少内存碎片的产生,提高内存的利用率。

大模型大数据攻城狮的专栏 2925

C/C++语言实现数据结构系列(一)——二叉树及二叉树的基本操作(先序、中序、后序、构造)

#include<stdio.h> #include<math.h> #include<stdlib.h> #include<algorithm> #define Status int #define ERROR -1 #define OK 1 #define FALSE 0 #define MAXSIZE 30 using namespace std; typedef struct Tree{ int data; struct Tree* left;

索半斤的博客 188

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

二叉树【链式、静态】创建(前中序、后中序、层中序)与基本操作(增查改、前中后层遍历【递归/非递归】)————附C/C++实现代码

1 二叉树定义 逻辑结构:树形结构——二叉树 存储结构:链式存储结构 C++: struct node { ElemType data;//数据域 node* lchild;//左孩子指针 node* rchild; //右孩子指针 ElemType layer; //层次 }; C: typedef struct BiTNode { ElemTyp...

韩江雪de 小屋 712

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

二叉树的C/C++实现

二叉树的C/C++实现【类BiTree下的变量注释】root 类型: BiTree * 存储了这个节点所属的树的最上层根节点地址,同时也是用来做节点身份认证的方式。很多 成员函数都会验证root是否为空,若为空认为是不正常的节点,不会对其进行操作,保证程 序稳定性。data 类型: ElemType 存储了节点的值,ElemType默认为int,可以通过更改BiTree.cpp里的ty

一只不会码代码的咸鱼 700

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C/C++算术表达式求值

(二)栈与二叉树遍历的实践 实践目的或任务:通过指导学生上机实践,对栈与二叉树遍历的基本概念及其不同的实现方法的理论得到进步掌握,并对在不同存储结构上实现不同的运算方式和技巧有所体会。实践基本要求: 1、了解实验目的及实验原理; 2、编写程序,并附上程序代码和结果图; 3、总结在编程过程中遇到的问题、解决办法和收获。 实践的内容或要求: 1、基本操作(必做部分) (1)编写函数,分别采用链式存储和顺序存储实现栈的初始化、入栈、出栈操作;编写函数,采用链式存储实现队列的初始化、入队、出队操作 (2)编写函数,

程序设计 870

汇编实现二叉树

今天翻找以前的代码, 突然发现, 以前曾经用汇编写的二叉树, 以前对汇编过于执着. 是好事, 也是坏事. 个人觉得, 用MASM写代码其实和C语言的差别是非常小的, 但是毕竟是不同的语言, 就和C和C++的差别一样, C++在C的基础之上多了一点东西, 多的这点东西带来的是思想上的转变, 汇编也是一样, 用汇编写的代码, 我觉得带来的其实也是一种思想. 一种用汇编想问题的思想. 有个

HUA的专栏 2306

cc++ leetcode 226. 翻转二叉树

c/c++ leetcode 226. 翻转二叉树 题目描述: 226. 翻转二叉树 难度简单537 翻转一棵二叉树。 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 解法一:递归 //需要注意的是子树只有一个节点时也需要翻转 ,前序和后序没有问题,只是中序需要点额外的操作,如果翻转节点后就访问的是左子树而不是右子树 TreeNod

qq_45569601的博客 320

linux c非递归遍历目录,Linux上的二叉树借助Stack非递归遍历

C/C++ code//BiTree.c#include#include"BiTree.h"#includeSqStack InitStack(SqStack S){S=(SqStack)malloc(sizeof(struct Stack));S->base =(struct BiTNode **)malloc(STACK_INIT_SIZE*sizeof(struct BiTNode**...

weixin_36257799的博客 193

二叉树(三)二叉树的高度、交换两个子树左右节点

比较简单: int depth(Node *head)//空二叉树的深度为-1,只有根节点为0,看连接线的个数就是其深度 { if (head==NULL) { return -1; } return max(depth(head->left),depth(head->right))+1; }

简洁之美 的专栏 1435

【数据结构】二叉树的(先序、中序、后序、层次)遍历方法实现

包括二叉树的创建、四中遍历方法、还有销毁、输出二叉树形等其他操作。

Blog 232

二叉树的遍历-树转换成二叉树-哈夫曼树(YNU数据结构实验五)

1.用C或C++语言建立二叉树,并实现二叉树的先根、中根、后根遍历。 2.在此基 础上,实现树与二叉树的相互转换。 3.实现一个简单的哈夫曼编码/译码器,能根据一段电文设计赫夫曼编码,并 能用该编码对一段给定的电文进行译码。

好学分子的博客 483

数据结构堆的c/c++的实现

本文主要讲堆的实现和概念

m0_54069809的博客 1442

二叉树的三叉链表存储和基本操作

三叉链表存储表示 改进于二叉链表,增加指向父节点的指针,能更好地实现结点间的访问。 存储结构 /* 二叉树的三叉链表存储表示 */ typedef struct BiTPNode { TElemType data; struct BiTPNode *parent,*lchild,*rchild; /* 双亲、左右孩子指针 */ }BiTPNode,*B...

weixin_34355715的博客 556

数据结构课程设计(C语言实现)

设计一个应用程序(C/C++),利用多级菜单实现单链表、栈、队列、二叉树及图五种结构的基本操作及应用。

亲爱的老吉先森呀 3939
上一篇: C/C++实现双向链表及基本操作
下一篇: 基于C++——在Linux环境下简单封装socket
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值