二叉树

完美二叉树, 完全二叉树和完满二叉树 完美二叉树、完全二叉树和完满二叉树 完美(Perfect)二叉树,完全(Complete)二叉树和完满(Full)二叉树的区别。 树(Tree) 树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。 树的基本术语 Root 根,树的顶端结点 Child 孩子,当远离根(Root)的时候,直接连接到另外一个结点的结点被称之为孩子(Child); Pare 阅读详情
此次作业中公共数据类型定义在如下同一个头文件中:

//bTree.h : 包含二叉树常用的存储结构和二叉树的常用算法

#include <stdio.h>

#define MaxNode 11			//s树or二叉树的最大节点个数

typedef char DataType;		//定义节点数据类型

typedef struct seqnode{		//定义顺序储存结构的树的节点
	DataType data;			//节点数据元素
	int parent;				//指向父亲的数组伪指针
}seqNode;

typedef seqNode SqTree[MaxNode];	//定义顺序储存结构的树

typedef DataType SqBTree[MaxNode];	//定义顺序存储结构的二叉树

typedef struct chnnode{	//定义链式存储结构的二叉树节点
	DataType data;			//节点数据元素
	struct chnnode * lchild;	//左孩子指针
	struct chnnode * rchild;	//右孩子指针
}chnNode;

typedef struct chnhead{		//定义链式存储节点二叉树的头结点
	int nodeCount;		//记录节点个数
	struct chnnode * root;	//指向根节点
}chnHead;

typedef chnHead CnBTree;	//定义链式存储结构的二叉树
7.4:
// problem_7.4.cpp : 定义控制台应用程序的入口点。
//

//probem:将n个节点以顺序存放的完全二叉树转化为二叉链存储结构

#include "stdafx.h"

#include "bTree.h"

chnNode * CnBTreeCreate(DataType * sbt,int n){		//递归方法创建完全二叉树,对于错误的完全二叉树,则只会在错误之前的节点正常
	chnNode *temp = NULL;
	if (n == 0)
		temp=CnBTreeCreate(sbt,n+1);
	else{
		if (*(sbt + n) == '#')
			temp = NULL;
		else{
			temp = (chnNode *)malloc(sizeof(chnNode));
			temp->data = *(sbt + n);
			if (2 * n < MaxNode)
				temp->lchild = CnBTreeCreate(sbt, 2 * n);
			else
				temp->lchild = NULL;
			if (2 * n + 1 < MaxNode)
				temp->rchild = CnBTreeCreate(sbt, 2 * n + 1);
			else
				temp->rchild = NULL;
		}
	}
	return temp;
}


int _tmain(int argc, _TCHAR* argv[])
{
	SqBTree Sbt = "#ABC#EFGHI";

	CnBTree Cnt;
	Cnt.nodeCount = strlen(Sbt) - 1;

	Cnt.root=CnBTreeCreate(Sbt,0);

	system("PAUSE");
	return 0;
}
// problem_7.5.cpp : 定义控制台应用程序的入口点。
void CnBTree2SeqBTree(chnNode * chn,DataType *sbt,int n){
	if (n == 0){
		*sbt = '#';
		CnBTree2SeqBTree(chn, sbt, n + 1);
	}
	else{
		if (chn == NULL){
			*(sbt + n) = '#';
			return;
		}
		else{
			*(sbt + n) = chn->data;
			if (2 * n < MaxNode - 1)
				CnBTree2SeqBTree(chn->lchild, sbt, 2 * n);
			if (2 * n + 1 < MaxNode - 1)
				CnBTree2SeqBTree(chn->rchild, sbt, 2 * n + 1);
		}
	}
}

7.6
// problem_7.6.cpp : 定义控制台应用程序的入口点。
//
bool IsCompleteBTree(CnBTree * cnt){
	SqBTree St = "##########";
	CnBTree2SeqBTree(cnt->root,St,0);
	for (int i = 1; i < MaxNode; i++)
		if (*(St + i) == '#')
			return false;
	return true;
}

7.7.
bTree.h新增加两种数据结构
typedef struct{
	chnNode * cnNode[MaxNode];
	int top;
}BTreeStack;

typedef struct{
	struct{
		chnNode * cnNode;
		int k;
	}WayNode[MaxNode];
	int top;
}WayStack;

void CreateChnBTree(chnNode * &cn , char * str){
	BTreeStack bts;
	bts.top = -1;
	int i = 0,k=0;
	char ch;
	chnNode * temp = NULL;

	while ((ch=*(str + i)) != '\0'){
		switch (ch){
		 case '(':
			 bts.cnNode[++bts.top] = temp;
			 k = 1;
			 break;
		 case ',':
			 k = 2;
			 break;
		 case ')':
			 k = 1;
			 bts.top--;
			 break;
		 default:
			 temp = (chnNode *)malloc(sizeof(chnNode));
			 temp->data = ch;
			 temp->lchild = NULL;
			 temp->rchild = NULL;
			 switch (k){
			 case 0:
				 cn = temp;
				 break;
			 case 1:
				 bts.cnNode[bts.top]->lchild = temp;
				 break;
			 case 2:
				 bts.cnNode[bts.top]->rchild = temp;
				 break;
			 }
			 break;
		}
		i++;
	}

}

bool FindWaybyStack(WayStack *ws, chnNode * cn, char e){
	ws->WayNode[++ws->top].cnNode = cn;
	ws->WayNode[ws->top].k = 0;
	chnNode * temp = NULL;

	while (ws->top != -1){
		if (ws->WayNode[ws->top].cnNode->data == e)
			//说明找到一条路径
			return true;
		else{
			if (ws->WayNode[ws->top].k == 0){
				ws->WayNode[ws->top].k++;
				temp = ws->WayNode[ws->top].cnNode->lchild;
				if (temp == NULL)
					continue;
				ws->WayNode[++ws->top].cnNode = temp;
				ws->WayNode[ws->top].k = 0;
			}
			else if (ws->WayNode[ws->top].k == 1){ 
				ws->WayNode[ws->top].k++;
				temp = ws->WayNode[ws->top].cnNode->rchild; 
				if (temp == NULL)
					continue;
				ws->WayNode[++ws->top].cnNode = temp;
				ws->WayNode[ws->top].k = 0;
			}
			else
				ws->top--;
		}
	}
	return false;
}


int _tmain(int argc, _TCHAR* argv[])
{
	char * btStr = "A(B(D(G),E(,H)),C(,F(,I(J))))";

	CnBTree cbt;
	cbt.root = NULL;

	CreateChnBTree(cbt.root,btStr);

	WayStack wSt;
	wSt.top = -1;

	bool mark=FindWaybyStack(&wSt,cbt.root,'I');
	if (mark == true){
		printf("路径如下:\n");
		for (int i = 0; i <= wSt.top; i++)
			printf("->%c", wSt.WayNode[i].cnNode->data);
	}
	else
		printf("该元素不存在!\n");

	system("PAUSE");
	return 0;
}


7.8:
chnNode * SwapNode(chnNode * cn){
	chnNode * temp;
	if (cn == NULL)
		return NULL;
	else{
		temp = (chnNode *)malloc(sizeof(chnNode));
		temp->data = cn->data;
		temp->lchild = SwapNode(cn->rchild);
		temp->rchild = SwapNode(cn->lchild);
		return temp;
	}
}

7.9:
利用7.8的交换函数,直接将两个左子树进行比较即可
bool IsSmmetry(chnNode *cn1,chnNode *cn2){
	if ((cn1 == NULL) ^ (cn2 == NULL))
		return false;
	else{
		if (cn1 != NULL&&cn2 != NULL)
			return IsSmmetry(cn1->lchild, cn2->lchild) & IsSmmetry(cn1->rchild, cn2->rchild);
		else
			return true;
	}
}

7.10:
bool IsUnionAncestor(char e,char e1,char e2,chnNode *cn){
	WayStack ws1, ws2;
	bool mark1 = false, mark2 = false;
	ws1.top = ws2.top = -1;
	if (FindWaybyStack(&ws1, cn, e1) && FindWaybyStack(&ws2, cn, e2)){
		for (int i = 0; i <= ws1.top; i++)
		if (ws1.WayNode[i].cnNode->data == e){
			mark1 = true;
			break;
		}
		for (int i = 0; i <= ws2.top; i++)
		if (ws2.WayNode[i].cnNode->data == e){
			mark2 = true;
			break;
		}
		return mark1 && mark2;
	}
	else
		return false;
}
一点点作业,记录一下
查找二叉树、完全二叉树、线索二叉树、最优二叉树 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、查找二叉树(二叉排序树)二、完全二叉树 前言 2021年上半年 软件设计师 上午试卷中有这样一道题 58.当二叉树的结点数目确定时,________的高度一定是最小的。 A.二叉排序树 B.完全二叉树 C.线索二叉树 D.最优二叉树 我已此为契机,了解一下查找二叉树、完全二叉树、线索二叉树、最优二叉树的一些相关定义(此题结尾会给出答案详解) 一、查找二叉树(二叉排序树) 二叉排序树的定义: 1、若根结点的左子树. 阅读详情

相关推荐

什么是二叉树

1.什么是二叉树?   面试中总有公司会问到二叉树问题,你会不一定能通过面试,但是不会肯定不行,那二叉树到底是什么?   二叉树作为一种重要的树形结构类型,在实际应用中有着十分广泛的应用和重要的意义。因为从许多实际问题中抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能够简单地转换为二叉树形式,而且二叉树的存储结构及其算法都比较简单,因此我们将讨论关于二叉树的存储、运算及应用。 2.二叉树的...

inhacker的博客 5226

前端进阶必备的树与二叉树知识

1. 有一颗树的括号表示为A(B, C(E, F(G)), D),回答下面的问题: 指出树的根结点? 指出棵树的所有叶子结点? 结点C的度是多少? 这棵树的度为多少? 这棵树的高度是多少? 结点C的孩子结点是哪? 结点C的双亲结点是谁? 答案: 这棵树的根结点为A 这棵树的叶子结点为B丶E丶G丶D // 叶子结点:一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称“叶子”。叶子是指出度为...

William_Hang的博客 3054

【数据结构】基础二叉树、真二叉树、满二叉树、完全二叉树、二叉树的遍历

树的介绍 简单的看一下树形结构: 生活中的树形结构: 树(Tree)的基本概念 节点:上面的树形结构,是由若干个节点和节点之间,连接起来构成的结构,ABCDEFGH都是一个单独的节点。最上面的节点成为根节点。 根节点:根节点是树层次结构中的最高节点。换句话说,根节点是没有任何父节点的节点。 父节点和子节点:上面的B节点就是E和F节点的父节点,E和F节点就是B节点的子节点。 兄弟节点:拥有相同父节点的节点称为兄弟节点,例如 E和F节点拥有相同的父节点B,所以两者称为兄弟节点。反之 E和G节点没有相同的

一个写湿的程序猿 3735

假设二叉树中每个结点的值为单个字符, 设计一个算法将一棵以二叉链方式存储的二叉树 b 转换成对应的顺序存储结构 a。——含具体实现工程

假设二叉树中每个结点的值为单个字符, 设计一个算法将一棵以二叉链方式存储的二叉树 b 转换成对应的顺序存储结构 a。——李春葆数据结构第五版第七章,P246,第十题 思路解析: 解:设二叉树的顺序存储结构类型为SqBTree,先将顺序存储结构a中所有元素置为‘#’(表示空结点)。将b转换成a的递归模型如下: f(b,a,i) -&gt; a[i]='#'; 当b=NULL f(b,a,i) -...

COCO56的博客 2万+

普通二叉树

1.什么是二叉树 树是一种比较重要的数据结构,它可以是二叉树,三叉树,可以说多叉树,但是我们今天是来看二叉树。二叉树是使用最广的树,二叉树是n个结点的有限集合,该集合为空集时候,就是我们空二叉树。或者有一个根结点有两棵互不相交的树分别称为左子树和右子树(或左孩子和右孩子),其次序不能任意颠倒。 画张图看一下   根结点:                           结点A 分...

xiaohui987987的博客 2450

NPP/VIIRS夜间灯光数据下载和介绍

夜间灯光数据作为当前比较火热的研究数据,与其他遥感数据不同,它是通过DN值来体现所携带的信息,最常用的使用月度数据。 该数据数据量大,下载慢,相对来说较难快速获取。 一、数据下载 美国国家海洋大气管理局NOAA下属的NCEI国家环境信息中心Earth Observation Group。 二、月度数据文件介绍 从网站上下载的逐月的灯光数据文件是压缩包的形式,每月的数据包括vcm, vcmsl两个版本的压缩包,其中vcm版本排除了受杂散光影响的数据,vcmsl版本为辐射值经过杂散光校正程序后的数

端木宛白的博客家园 7377

链式二叉树

include<stdio.h> include<stdlib.h> define maxsize 100 typedef char TElemType; typedef struct node{ TElemType data[maxsize]; TElemType n; }SqBTree; void createBinTree_Pre (SqBTree &T,TE...

weixin_30341745的博客 134

大开眼界的十大开源人工智能项目

这是一个强大的开源工具,能让你在不同框架之间自由切换,无需重写代码。它是一个开源工具,能用简单的SQL语言同时处理数据和AI模型,让一切变得有序而高效。Rasa是我开发智能聊天机器人时的首选,它让你轻松掌控机器人对话的每个细节。我经常用它快速验证模型在不同框架下的表现,省去了大量烦躁的调试过程。最近发现的Vapi是一个以API方式提供的语音AI工具,开发者友好程度超乎想象。KNIME是一个以拖拽方式构建数据分析流程的开源工具,仿佛是数据界的乐高积木。它像个忠诚的守门员,确保你的模型始终健康运行。

wjianwei666的专栏 1106

二叉树的创建、(七种)遍历

这一篇博客主要总结一下二叉树的创建、遍历以及整个流程。 会对二叉树的遍历进行总结,二叉树可是有七种(三大类)遍历方式的! 科普: 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。 二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树

yx20130919的博客 613

超详细流式细胞术全流程解析:从样本制备到结果分析全攻略

流式细胞术(Flow Cytometry)是现代生物学和医学研究中不可或缺的高通量分析技术,可实现对细胞表型、功能状态、细胞周期等多维度参数的快速检测。本文将从实验全流程出发,详解样本制备、上机操作、参数设置及结果处理的核心要点,帮助科研人员精准掌握流式实验关键技术。

good_rrrrr的博客 3869

ElasticSearch 集群安全加固实战:从零配置TLS证书与密码认证

本文提供了一份详尽的ElasticSearch集群安全加固实战指南,重点介绍了如何从零开始配置TLS证书与用户安全认证。通过分步讲解证书生成、节点配置、集群重启及密码设置,帮助管理员为ES集群构建通信加密与访问控制的双重防线,有效提升数据安全性与合规性。

weixin_29323493的博客 444

数据结构与算法-Node和SeqList<T>

package key3; public class Node<T>//单链表结点类,T指定结点的元素类型 { public T data; //数据域,存储数据元素 public Node<T> next; //地址域,引用后继结点 public Node(T data, Node<T> next)//构造结点,data...

你若盛开,清风自来 1213

迪文串口屏开发环境搭建全流程:从DGUS Tool到串口联调

串口屏作为嵌入式人机交互的核心组件,通过串口通信实现主控MCU与显示终端的指令交互。其工作原理基于变量地址映射,主控读写VP地址即可驱动屏上控件,兼具低功耗与高稳定性。在工业控制、医疗设备及智能家居面板等场景中,串口屏能显著降低开发门槛与硬件成本。迪文屏凭借DGUS Tool上位机与自定义串口协议,成为主流选择。掌握DGUS Tool版本匹配、串口驱动安装及VP地址规划,是快速搭建开发环境的关键。

weixin_33937499的博客 611

二叉树(完美二叉树、完全二叉树、完满二叉树)

二叉树(完美二叉树、完全二叉树、完满二叉树)树的概念树的基本术语二叉树(Binary Tree)什么是二叉树(Binary Tree)二叉树的性质完美二叉树(Perfect Binary Tree)完全二叉树(Complete Binary Tree)完满二叉树(Full Binary Tree)比较区分完美二叉树 v.s. 完全二叉树完满(Full)二叉树 v.s. 完全(Complete)二叉...

老人家独爱茉莉的博客 3万+

【ComfyUI】Wan2.2 Animate 背景保留动作迁移视频生成

本文介绍了一个基于ComfyUI的高精度视频生成工作流"Wan2.2 Animate",该系统融合动作捕捉、图像拼接和LoRA加权等技术,能自动识别人脸并完成精准动作迁移,同时保持背景稳定。工作流采用模块化设计,包含输入提取、图像融合、模型加载等关键节点,核心模型Wan2.2-Animate-14B支持fp8精度与BlockSwap控制。流程分为图像输入、动作提取、多图合成等五个阶段,通过文本提示编码器和图像语义编码器实现语义驱动的动作生成,最终输出高质量视频,适用于虚拟形象驱动和

Mr数据杨 2273

Playwright实战:打造绕过全维度前端反爬的无头浏览器爬虫(2026实战版)

Playwright绕过前端反爬的核心是模拟真实:真实的设备指纹、真实的行为轨迹、真实的网络请求;2025年前端反爬的核心检测维度是设备指纹+行为轨迹+网络请求,三者缺一不可;实战中需重点关注WebGL/Canvas指纹模拟、行为随机性、请求头完整性,这是绕过反爬的关键;性能优化需以“不触发反爬”为前提,优先选择浏览器复用、资源拦截,而非无限制并发。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2094

二叉树、平衡二叉树、完全二叉树、满二叉树

基本概念结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层。二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度。 二叉树在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆。二叉树的每个结点至多只有二棵子树(不存在

Terry的IT世界 9万+

目标检测YOLO实战应用案例100讲-基于YOLOv7的番茄采摘机械手场景感知及试验(下)

根据软件系统的设计需求,制定系统的可行性方案分析,编写系统的相关程序和 调试运行环境,对系统进行测试,以实现对番茄数据的采集及监测。登陆界面登陆后,进入选择界面,菜单包括了对番茄种植棚室的固定相机数据的监测、 对番茄采摘机械手的双目相机采集的番茄的静态、动态数据的获取、对番茄静态、动态数 据处理的功能菜单等选项。与利用人工去进行对于番茄果实的识别和数目的统计相比,番茄视觉系统自动记录番 茄数量以及红色已经成熟的番茄、青色未成熟番茄的数量,减轻人工记录的工作量,减少 人工记录的误差,从经济方面是可行的。

qq_36130719的博客 812

完美二叉树、完全二叉树、完满二叉树

1、二叉树(Binary Tree) 1.1 什么是二叉树(Binary Tree) 每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。 1.2 二叉树的性质 若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i&amp;amp;amp;gt;=0)。 高度为k的二叉树最多有2^(k+1) - 1个结点(k&amp;amp;amp;gt;=-1)。 (空树的高...

pg的博客 2万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最全二叉树:完整详解二叉树的遍历以及完全二叉树等6种二叉树

树在数据结构中占据了非常重要的位置,尤其是二叉树。经常是在java面试中必问的一个环节,而且二叉树的应用场景真的非常普遍,需要重点掌握好。 但是一直以来,很多同学对于二叉树的掌握都是不太全面。今天我就来谈谈二叉树,希望你喜欢这个Java数据结构与算法这个专题,认真看完后你会对二叉树会有一个比较完整的了解。 重点会谈到以下几点: 二叉树 二叉树的遍历方式 二叉树有哪些种类 满二叉树 完全二叉树 二叉搜索树 平衡二叉树(AVL) 左旋与右旋 1.什么是二叉树 二叉树:就是每个节点都只能有两个子节点的树结构.

lyl5454的博客 3828

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

二叉树,完全二叉树,满二叉树,完美二叉树(有图干货)

二叉树:树中每个节点至多有两个子节点 【最普通的二叉】 二叉搜索树:对于树中任何节点,如果其左子节点不为空,那么该节点的value值永远>=其左子节点;如果其右子节点不为空,那么该节点的value值永远<=其右子节点 【回顾一下中序遍历】 满二叉树(Full Binary Tree):树中除了叶子节点,每个节点都有两个子节点 美国NIST给出的定义为: A...

J.R.Leonardo的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

二叉树、完全二叉树、完满二叉树、满二叉树

简单定义:每个节点最多只有2个子节点的树叫做二叉树。专业定义:二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。下图为一棵普通二叉树。

流华追梦的专栏 2854

二叉树详解:带你掌握二叉树

因为二叉树是一种特殊的树,所以想要学习好二叉树,必须了解树型结构,知道树的基本概念。所以正式开始学习之前,在前面为大家引入了树的概念。这篇博客主要为大家带来树及二叉树的基本概念,性质,遍历方式等,下篇博客将为大家带来代码的实现以及应用。期待大家关注!最后,祝大家61快乐,天天开心!

是小辰 1280
上一篇: wamp手动搭建
下一篇: binary tree
Codelee1995
博客等级 码龄12年 3粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值