二叉树的一些基本运算

二叉树基本算法 文章目录二叉树定义:一、递归遍历1、先序遍历2、中序遍历3、后序遍历4、递归序二、非递归遍历1、先序遍历2、中序遍历3、后序遍历三、二叉树按层遍历 二叉树定义: 二叉树(英语:Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。更多解释,详见堆和堆排序。 一、递归遍历 1、先序遍历 根左右。a,b,d,e,c,f,g /** * 二叉树:先序遍历。根-左-右 * * 经典递归写法 阅读详情
树型结构的用途很广,其中二叉树尤为重要。
这里列出了几种基本的算法

(1)遍历二叉树。(先序遍历,递归方式,采用广义表的格式输出)
(2)求某节点的左、右孩子节点值
(3)求二叉树的深度(递归方式)
(4)求二叉树的宽度(类似层次遍历,用到队列)
(5)求二叉树的节点个数(递归)
(6)求二叉树叶子节点个数(递归)

代码里写的很明白了,上面的括号是下面的代码实现方式的简述。

#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
#include "algo7_1.h"

//---------------------------------------

void CreateBTNode(BTNode *&Bt,char str[])
{

	BTNode *St[MaxSize],*p = NULL;
	int top = 0,base = 0,k=0,j=0;	//k:标志左右节点
	char ch = str[j];

	Bt = NULL;

	while(ch != '\0')
	{
		switch (ch)
		{
		case '(':
			St[top] = p;
			top++;
			k =1;	//左结点
			break;

		case ')':
			top--;
			break;
		case ',':
			k = 2;
			break;
		default:
			p =  (BTNode *)malloc(sizeof(BTNode));
			p->data = ch;
			p->lchild = NULL;
			p->rchild = NULL;
			if (Bt == NULL)
			{
				Bt = p;
			}
			else
			{
				switch(k)
				{
				case 1:
					St[top - 1]->lchild = p;
					break;
				case 2:
					St[top - 1]->rchild = p;
					break;
				}
				k = 0;
			}
		}	//switch
		j++;
		ch = str[j];

	}	//while

}
//寻找指定结点
BTNode * FindNode(BTNode * Bt,ElemType e)	//递归
{
	BTNode *p = NULL;
	if (Bt == NULL)
	{
		return NULL;
	}
	else if (Bt->data == e)
	{
		return Bt;
	}
	else
	{
		p=FindNode(Bt->lchild,e);
		if ( p != NULL)
		{
			return p;
		}
		else
			return FindNode(Bt->rchild,e);

	}

}

//返回Bt指向的左结点
BTNode * LchildNode(BTNode *Bt)
{
	if (!Bt)
	{
		return NULL;
	}
	else
		return Bt->lchild;
}
//返回Bt指向的右结点
BTNode * RchildNode(BTNode *Bt)
{
	if (!Bt)
	{
		return ERR;
	}
	else
		return Bt->rchild;
}

//求二叉树Bt的深度
int BTNodeDepth(BTNode *Bt)
{
	int lchildDep,rchildDep;
	if (0 == Bt)
	{
		return 0;
	}
	else
	{
		lchildDep = BTNodeDepth(Bt->lchild);
		rchildDep = BTNodeDepth(Bt->rchild);
		return lchildDep>rchildDep?(lchildDep+1):(rchildDep+1);
	}

}

//以广义表的方式输出二叉树
void DispBTNode(BTNode * Bt)
{
	if (NULL == Bt)
	{
		return;
	}
	else
	{
		printf("%c",Bt->data);
		if (Bt->lchild || Bt->rchild)
		{
			printf("(");
			DispBTNode(Bt->lchild);
		}
		if (Bt->rchild)
		{
			printf(",");
			DispBTNode(Bt->rchild);
			printf(")");
		}
	}

}

//返回二叉树Bt的宽度
int BTWidth(BTNode * Bt)
{
	struct 
	{
		BTNode *p;
		int lno;
	} Que[MaxSize];
	BTNode * Aux;
	int front = 0,rear = 0;
	int max = 0,lNum = 0;
	struct
	{
		int lcur;
		int lSumNum;
	} lSum = {0,0};

	if (!Bt)
	{
		return 0;
	}
	else
	{
		Que[rear].p = Bt;
		Que[rear++].lno = 1;
		while(rear != front)			//层次遍历
		{
			if (lSum.lcur!=lNum)
			{
				max = max>lSum.lSumNum?max:lSum.lSumNum;
				lSum.lcur = lNum;	//新一层
				lSum.lSumNum = 0;	//重新开始计数
			}
			Aux = Que[front].p;
			lNum = Que[front].lno;
			front++;
			if (Aux->lchild != NULL)
			{
				Que[rear].p = Aux->lchild;
				Que[rear].lno = lNum +1;
				rear++;
				lSum.lSumNum++;
			}
			if (Aux->rchild != NULL)
			{
				Que[rear].p = Aux->rchild;
				Que[rear].lno = lNum +1;
				rear++;
				lSum.lSumNum++;
			}			
		}	//while
		return max;
	}
}

//求二叉树Bt的结点个数
int Nodes(BTNode *Bt)	//递归
{
	int lchildNo,rchildNo;
	if (!Bt)
	{
		return 0;
	}
	else
	{
		lchildNo = Nodes(Bt->lchild);
		rchildNo = Nodes(Bt->rchild);
		return(lchildNo + rchildNo + 1);
	}
}

//求二叉树Bt的叶子结点个数
int LeafNodes(BTNode *Bt)
{
	int lchildNo,rchildNo;
	if (!Bt)
	{
		return 0;
	}
	else if (Bt->lchild == 0 && Bt->rchild == 0)
	{
		return 1;
	}
	else
	{
		lchildNo = LeafNodes(Bt->lchild);
		rchildNo = LeafNodes(Bt->rchild);
		return lchildNo +rchildNo;
	}

}


//algo7_1.h
#define OK 1
#define ERR 0
#define TRUE 1
#define FALSE 0
#define NULL 0
typedef int BOOL;

#define MaxSize 100
typedef char ElemType;
typedef struct _node
{
	ElemType data;				//数据元素
	struct _node * lchild;		//左子树
	struct _node * rchild;		//右子树
}BTNode;

void CreateBTNode(BTNode * &Bt,char str[] );	//根据str串,用广义表的表现形式,来生成树
//寻找指定结点
BTNode * FindNode(BTNode * Bt,ElemType e);	//递归
//返回Bt指向的左结点
BTNode * LchildNode(BTNode *Bt);
//返回Bt指向的右结点
BTNode * RchildNode(BTNode *Bt);
//求二叉树Bt的深度
int BTNodeDepth(BTNode *Bt);
//以广义表的方式输出二叉树
void DispBTNode(BTNode * Bt);
//返回二叉树Bt的宽度
int BTWidth(BTNode * Bt);
//求二叉树Bt的结点个数
int Nodes(BTNode *Bt);	//递归
//求二叉树Bt的叶子结点个数
int LeafNodes(BTNode *Bt);

// Proj7_1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "algo7_1.h"
#include "string.h"

int _tmain(int argc, _TCHAR* argv[])
{
	BTNode *b,*p,*lp,*rp;
	char str[100];
	printf("Please input the generalized list of binary tree:\n");
//	scanf_s("%s",str);
//	strcpy_s(str, "A(B(C(D,E),F(G,H(I,J))),K(L,M(N,O(P(Q,R)))))");
	strcpy_s(str, "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
	CreateBTNode(b,str);

	printf("(1)Output the binary tree:\n");
	DispBTNode(b);
	printf("\n");

	printf("(2)The node of \'H\':\n");
	p = FindNode(b,'H');
	if (p)
	{
		lp = LchildNode(p);
		if (lp)
		{
			printf("lchild is %c\n",lp->data);
		}
		rp = RchildNode(p);
		if (rp)
		{
			printf("rchild is %c\n",rp->data);
		}
	}
	printf("\n");
	printf("(3)The binary tree's depth:%d\n",BTNodeDepth(b));
	printf("(4)The binary tree's width:%d\n",BTWidth(b));
	printf("(5)The binary tree's sum node:%d\n",Nodes(b));
	printf("(6)The binary tree's leaf node:%d\n",LeafNodes(b));

	return 0;
}


测试二叉树:
A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))



结果:
















二叉树基本运算算法 目录 1.效果截图: 2.基本运算,写进头文件中 3.主函数 4.编写界面 2.基本运算,写进头文件<btree.h>中 #ifndef BTREE_H_INCLUDED #define BTREE_H_INCLUDED //二叉树的基本运算算法 #include<stdio.h> #include<malloc.h> #define MaxSize 100 typedef char ElemType; typedef struct node... 阅读详情

相关推荐

编写一个程序btree.cpp, 实现二叉树基本运算

(验证性实验)实现二叉树的各种基本运算的算法 编写一个程序btree.cpp, 实现二叉树基本运算,并在此基础上设计一个程序exp5-1.cpp,完成如下功能。由图所示的二叉树创建对应的二叉链存储结构b,叉树的括号表示串为“A(B(D,E(H(J,K(L,M(,N))))),C(,I)))”输出二叉树b输出‘H’结点的左、右孩子结点值输出二叉树b的高度释放二叉树b 代码如下 btree //二叉树的基本运算算法 #include <stdio.h>#include <malloc.h

xx7755223的博客 1万+

算法 - 二叉树的基本算法

目录 一、二叉树 二、二叉树的先序、中序、后序遍历 (一)、递归遍历 (二)、非递归遍历 (1)先序:头左右 (2)中序:左头右 (3)后序:左右头 三、实现二叉树的按层遍历 (一)、遍历-队列 (二)、求最大层的宽度 四、二叉树的序列化和反序列化 (一)、递归 (二)、按层 一、二叉树 图示: 结构: public class BtreeNode { public int value; public BtreeNode left; pub..

weixin_40459875的博客 6695

Claude Code VSCode集成开发指南:AI编程助手完整配置

Claude Code与Visual Studio Code的深度集成为开发者提供了强大的AI编程支持。本文详细介绍Claude Code VSCode扩展的安装配置、功能特性和实际应用方法。通过完整的配置流程和代码示例,帮助开发者充分利用Claude AI的智能编程能力。文章涵盖从环境搭建到高级功能应用的完整指南,包括代码自动补全、智能重构、实时代码分析等核心功能的使用技巧,以及与现有开发工作流的整合方案。

2501_93058131的博客 5988

二叉树的基本运算

上一讲我们已经讲了创建二叉树,所以这一讲,我们来说一下二叉树的基本运算方法,为以后二叉树的运用打下基础:(1)查找节点FindNode(*b,x):(2)找孩子节点LchildNode§和Rchild-Node§:(3)求高度BTNodeDepth(*b):(4)输出二叉树DispBTNode(*b):如上图,就是我们举的例子:我们定义的二叉树节点结构如下: (1)查找节点 FindNode(*b,x) •找到值为x的节点后返回节点指针,否则返回NULL•用递归算法,采用"根-左子树-右子树"的顺序,查找值

qq_57484399的博客 2535

Lmbench测试集 --- 延迟测试工具lat_mem_rd

lmbench测试集简介 以及 lat_mem_rd延迟测试工具: 如何测试、测试结果、源码分析

MonologueYY的博客 1万+

论文理解【LLM-OR】——【OptiMUS】Scalable Optimization Modeling with (MI)LP Solvers and Large Language Models

OptiMUS 把“自然语言→优化建模与求解”从单次生成改造成“结构化问题 + 多智能体协作 + 连接图检索”的模块化流程,并在更长更难的数据集上验证了这种结构化方法相对端到端 prompting 的优

佚失的诗篇 829

二叉树的基本运算(涉及递归均有给出模型)

介绍二叉树的概念和存储结构,详细描述了二叉树的基本运算,每一步都有配图,对于需要递归解决的问题有给出递归模型,最后有给出总代码,和给出调试的括号表达式。

2301_80035594的博客 2107

Notion卡顿救星:3分钟搞定DNS优化,手机电脑全平台加速指南

本文针对Notion访问慢和卡顿问题,提供了全平台DNS优化与Hosts文件修改的详细指南。通过更换优质DNS服务器或建立静态IP映射,可有效解决因网络延迟和域名解析导致的加载缓慢,实现手机与电脑端的快速加速,提升Notion使用流畅度。

v6b7n8m9q0的博客 1307

二叉树的基本算法

二叉树的先序遍历 就是每棵子树,都是先出现头结点、再左子树、再右子树。 递归序列!!! 一定会到达这个Node节点三次,也表明了有三个位置进行Node数据的处理,前中后 每个节点都是这样。 先序就是第一次到达某个节点就打印 中序就是第二次到达某个节点就打印 后序就是第三次到达某个节点再打印。 二叉树可以先去左边树上转一圈,再回到中间节点,再去右边树上转一圈,可以进行信息的整合。 f(Node) { if(Node==NULL) return; // 1 ...

weixin_38216573的博客 1464

对偶分解算法详解及其Python实现

对偶分解算法是一种广泛应用于求解凸优化问题的有效方法,尤其在大规模数据处理和分布式计算中展现出强大的实用性。在许多实际应用中,直接求解原始问题可能由于计算复杂度过高、资源受限或问题规模过大而变得不可行。这时,对偶分解方法为我们提供了一种高效的替代方案。对偶分解算法的核心思想是将复杂的原问题转化为其对应的拉格朗日对偶问题。通过引入拉格朗日乘子并构造对偶函数,该方法在一定程度上简化了问题的求解过程。特别是,对于包含多个约束条件的大规模优化问题,对偶分解可以将原问题分解为若干个小规模、相互独立的子问题。

闲人编程的博客 1754

标准测试测试数据STDF学习笔记

本文介绍了STDF(Standard Test Data Format)文件的结构与解析方法。首先详细说明了STDF记录的组成,包括记录头类型(REC_TYP和REC_SUB)、数据类型定义、时间日期格式以及无效数据标识。重点分析了25种主要记录类型的功能、数据内容和出现位置,如FAR、MIR、MRR等关键记录。然后介绍了基于pystdf开源工具的解析方法,包括自带脚本的使用和自编程解析流程,通过事件驱动机制处理数据流。特别指出测试数据是按照PIR→PTR/MPR/FTR→PRR的循环模式组织。文章为ATE

歌颂苦难的行为是无耻的; 1516

树和二叉树:二叉树基本运算及其实现

树和二叉树基本运算及其实现 二叉树的基本运算概述 归纳起来,二叉树有以下基本运算: 创建二叉树CreateBTNode(*b, *str):根据二叉树括号表示法字符串str生成对应的二叉链存储结构b 销毁二叉链存储结构DestroyBT(*b):销毁二叉链b并释放空间 查找节点FindNode(*b,x):在二叉树b中寻找data域值为x的节点,并返回指向该节点的指针 找孩子节点LchildNode( p) 和RchildNode( p):分别求二叉树中节点*p的左孩子节点和右孩子节点 求高度BTNode

weixin_51958878的博客 4538

树莓派 RP2350B 开发环境搭建

本文介绍了树莓派RP2350B开发环境的搭建过程。

张一西的博客 287

C++ 二叉树的基本运算及实现

C++ 二叉树的基本运算及实现二叉树的定义二叉树的性质性质1:非空二叉树上的叶子结点数等于双分支结点数加1 二叉树的定义 二叉树是一个有限的结点的集合,这个集合或者为空,或者由一个根节点和两棵互不相交的称为左子树和右子树的二叉树组成。 二叉树的表示法和树的表示法一样,有树形表示法、文氏图表示法、凹入表示法和括号表示法等。 满二叉树: 在一棵二叉树中,如果所有分支结点都有左孩子和右孩子结点,并且叶子结点都集中在二叉树的最下一层,这样的二叉树称为满二叉树。我们可以对满二叉树的结点进行层序编号,约定从树根为1

bobi1024的博客 3435

从0到1:用Claude 3.7十日拿下教育部课题申报书(附可修改LaTeX模板)

🟣"作为教育部人文社科项目评审专家,请根据近三年立项数据分析,为[您的学科方向]领域推荐5个具有创新性且符合'十四五'规划的重点选题,要求选题体现交叉学科特征,并标注潜在理论突破点"🟣"根据前期研究基础,创建包含4个研究模块、12个关键节点的三维技术路线图,要求体现实验仿真-实证研究-理论建模的螺旋递进关系,并标注每个节点的预期成果形态"🟣"现在切换至教育部学科评审组组长模式,从选题价值、创新程度、研究可行性三个维度对本申报书进行盲审,生成包含9个扣分风险点的诊断报告及修改优先级排序"

智能AI让学术科研更容易 545

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

实现二叉树的各种基本运算的算法

 #include #include #define MaxSize 100 typedef char ElemType; typedef struct node {  ElemType data;    //数据元素  struct node *lchild;  //指向左孩子  struct node *rchild;  //指向右孩子 } BTNode; voi

追溯的博客 2万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

实现二叉树各种基本运算的算法

/** *    实验题目: *        实现二叉树各种基本运算的算法 *    实验目的: *        领会二叉链存储结构和掌握二叉树中各种基本运算算法设计 *    实验内容:         设计程序,实现二叉树的基本运算,在此基础上,完成如下功能: *    1、由二叉树创建对应的二叉链存储结构b,该二叉树的括号表示串为 *       "A(B(D,E(H(J,K(L,M(,...

xiezhi123456的博客 7726

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

二叉树的各种基本运算

二叉树的各种基本运算 码文不易,如果帮助到您,希望您可以下载一个压缩包,与您无害,与我有益谢谢 支持原创 。   欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。   在计算机科学中,二叉树(英语:Binary tree)是每个节点最多只有两个分支(不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”和“右子树”。二...

Paradox 1万+

二叉树的链式存储及基本运算

问题描述: /* 01. 02. 03.*Copyright(c) 2015,烟台大学计算机学院 04.*All rights reserved. 05.*文件名称: Painc.cpp 06.*作 者: 田** 07.*完成日期:2015年11月9日 08.*版 本 号:V1.0 09.* 10.*问题描述: 二叉树的链式存储及基本运算

Painc. 1204

数据结构实验:实现二叉树的各种基本运算的算法

(1)由如图7.1所示的二叉树创建对应的二叉链存储结构6,该二叉树的括号表示串为"A(B(D,E(H(J,K(1.MN))))CFGD))"· FindNode(BTNode *b,ElemType x):返回 data 域为x的结点指针。·DestroyBTree(BTNode*&b):释放二叉树b的所有结点。·LchildNode(BTNode*p):返回户结点的左孩子结点指针。·BTHeight(BTNode *b):返回二叉树b的高度。(3)输出'H'结点的左、右孩子结点值。(5)释放二叉树b。

u014114223的博客 1753

二叉树基本运算算法实现

二叉树的基本运算算法实现: 1.创建二叉树:根据二叉树的括号表示法的字符串生成二叉链存储结构 2.销毁二叉树:释放所有结点分配的空间 3.查找结点 4.查找孩子结点 5.求二叉树高度 6.输出二叉树:用括号表示法 创建二叉树 typedef struct node { int data; struct node * lchild; struct node * rchild;...

qq_40635938的博客 4184

数据结构实验6——二叉树的基本运算

1、学会了递归算法在二叉树上的一些应用,递归算法非常简洁明了,但是在使用时需要明确其递归出口。2、在写代码的时候要先序和后序不同应用场景,在需要保留根节点时使用后序遍历。3、free之后是只是释放了指针存放地址的内存空间,free之后依旧需要指向NULL。

BYBONNIR的博客 640

二叉树的基本运算(数据结构学习笔记)

文章目录基本运算创建二叉树 CreateBTNode(*b,*str)算法分析创建二叉树的过程:创建二叉树图示过程:算法代码销毁二叉链 DestroyBT(*b)算法代码查找结点 FindNode(*b,x)算法代码找孩子结点 LchildNode(p)和RchildNode(p)算法代码求二叉树高度 BTNodeDepth(*b)算法代码输出二叉树 DispBTNode(*b)算法代码 采用二叉链存储结构讨论二叉树的基本运算算法。 基本运算 二叉树的基本运算包括: 创建二叉树 销毁二叉树 找孩子结点

省洗发水钱买书 2065

二叉树1:二叉树的基本运算

9,(选做题)任意给定该二叉树的两个结点,输出它们的最近的公共祖先。(例:对P243图7.34,输入J, N,它们的祖先是H,E,B,A,最近的祖先是H。编写一个程序,实现二叉树的基本运算,具体要求如下:(指定示范实例1:P243图7.34。2,输入一个结点的值,输出该结点的左,右孩子的值。(要能测试错误数据)8,输出该二叉树的宽度。5,输出该二叉树双分支结点的个数。6,输出该二叉树单分支结点的个数。7,输出该二叉树叶子结点的个数。4,输出该二叉树结点的个数。3,输出该二叉树的高度。10,销毁该二叉树。

打铁还需自身硬 462

数据结构与算法 二叉树基本运算

1、树就是一种非线性结构,在二叉树基本操作算法中经常会用到递归思维。2、二叉树由三个基本单位组成:根结点,左子树,右子树,因此,若能依次遍历这三部分,则可以遍历完整个二叉树3、二叉树高度:只要计算左右子树的深度,再将两者比较,再返回较大值加一即可(空树返回0值)。

XLB 843
上一篇: 汇编指令速查
下一篇: WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标
epluguo
博客等级 码龄18年 34粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值