数据结构(陈越,何钦铭) 第四讲 树(中)

news/2025/2/26 16:35:42

4.1 二叉搜索树

4.1.1 二叉搜索树及查找

在这里插入图片描述

Position Find(ElementTyoe X,BinTree BST){
	if(!BST){
		return NULL;
	}
	if(X>BST->Data){
		return Find(X,BST->Right)
	}else if(X<BST->Data){
		return Find(X,BST->Left)
	}else{
		return BST;
	}
} 

Position IterFind(ElementType X,BinTree BST){
	while(BST){
		if(X>BST->Data){
			BST=BST->Right;
		}else if(X<BST->Data){
			BST=BST->Left;
		}else{
			return BST;
		}
	}
}

Position FindMin(BinTree BST){
	if(!BST){
		return NULL;
	}else if(!BST->Left){
		return BST;
	}else{
		return FindMin(BST->Left);
	}
}

Position FindMax(BinTree BST){
	if(BST){
		while(BST->Right){
			BST=BST->Right;
		}
	}
	return BST;
}

4.1.2 二叉搜索树的插入

BinTree Insert(ElementType X,BinTree BST){
	if(!BST){
		BST=(BinTree)malloc(sizeof(struct TreeNode));
		BST->Data=X;
		BST->Left=BST->Right=NULL;
	}else{
		if(X<BST->Data){
			BST->Left=Insert(X,BST->Left);
		}else if(X>BST->Data){
			BST->Right=Insert(X,BST->Right);
		}
	}
	return BST;
}

4.1.3 二叉搜索树的删除

BinTree Delete(ElementType X,BinTree BST){
	Position Tmp;
	if(!BST){
		printf("要删除的元素未找到");
	}else if(X<BST->Data){
		BST->Left=Delete(X,BST->Left);
	}else if(X>BST->Data){
		BST->Right=Delete(X,BST->Right);
	}else{
		if(BST->Left&&BST->Right){
			Tmp=FindMin(BST->Right);
			BST->Data=Tmp->Data;
			BST->Right=Delete(BST->Data,BST->Right);
		}else{
			Tmp=BST;
			if(!BST->Left){
				BST=BST->Right;
			}else if(!BST->Right){
				BST=BST->Left;
			}
			free(Tmp);
		}
	}
	return BST;
}

4.2 平衡二叉树

4.2.1 什么是平衡二叉树

在这里插入图片描述

4.2.2 平衡二叉树的调整

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Position Find(ElementTyoe X,BinTree BST){
	if(!BST){
		return NULL;
	}
	if(X>BST->Data){
		return Find(X,BST->Right)
	}else if(X<BST->Data){
		return Find(X,BST->Left)
	}else{
		return BST;
	}
} 

Position IterFind(ElementType X,BinTree BST){
	while(BST){
		if(X>BST->Data){
			BST=BST->Right;
		}else if(X<BST->Data){
			BST=BST->Left;
		}else{
			return BST;
		}
	}
}

Position FindMin(BinTree BST){
	if(!BST){
		return NULL;
	}else if(!BST->Left){
		return BST;
	}else{
		return FindMin(BST->Left);
	}
}

Position FindMax(BinTree BST){
	if(BST){
		while(BST->Right){
			BST=BST->Right;
		}
	}
	return BST;
}

BinTree Insert(ElementType X,BinTree BST){
	if(!BST){
		BST=(BinTree)malloc(sizeof(struct TreeNode));
		BST->Data=X;
		BST->Left=BST->Right=NULL;
	}else{
		if(X<BST->Data){
			BST->Left=Insert(X,BST->Left);
		}else if(X>BST->Data){
			BST->Right=Insert(X,BST->Right);
		}
	}
	return BST;
}

BinTree Delete(ElementType X,BinTree BST){
	Position Tmp;
	if(!BST){
		printf("要删除的元素未找到");
	}else if(X<BST->Data){
		BST->Left=Delete(X,BST->Left);
	}else if(X>BST->Data){
		BST->Right=Delete(X,BST->Right);
	}else{
		if(BST->Left&&BST->Right){
			Tmp=FindMin(BST->Right);
			BST->Data=Tmp->Data;
			BST->Right=Delete(BST->Data,BST->Right);
		}else{
			Tmp=BST;
			if(!BST->Left){
				BST=BST->Right;
			}else if(!BST->Right){
				BST=BST->Left;
			}
			free(Tmp);
		}
	}
	return BST;
}

小白专场

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode *Tree;
struct TreeNode{
	int v;
	Tree Left,Right;
	int flag;
};

Tree NewNode(int V){
	Tree T=(Tree)malloc(sizeof(struct TreeNode));
	T->v=V;
	T->Left=T->Right=NULL;
	T->flag=0;
	return T;
}

Tree Insert(Tree T,int V){
	if(!T){
		T=NewNode(V);
	}else{
		if(V>T->v){
			T->Right=Insert(T->Right,V);
		}else{
			T->Left=Insert(T->Left,V);
		}
	}
	return T;
}

Tree MakeTree(int N){
	Tree T;
	int i,V;
	scanf("%d",&V);
	T=NewNode(V);
	for(i=1;i<N;i++){
		scanf("%d",&V);
		T=Insert(T,V);
	}
	return T;
}


int check(Tree T,int V){
	if(T->flag){
		if(V<T->v){
			return check(T->Left,V);
		}else if(V>T->v){
			return check(T->Right,V);
		}else{
			return 0;
		}
	}else{
		if(V==T->v){
			T->flag=1;
			return 1;
		}else{
			return 0;
		}
	}
}

int Judge(Tree T,int N){
	int i,V,flag=0;
	scanf("%d",&V);
	if(V!=T->v){
		flag=1;
	}else{
		T->flag=1;
	}
	for(i=1;i<N;i++){
		scanf("%d",&V);
		if((!flag)&&(!check(T,V))){
			flag=1;
		}
	}
	if(flag){
		return 0;
	}else{
		return 1;
	}
}

void ResetT(Tree T){
	if(T->Left){
		ResetT(T->Left);
	}
	if(T->Right){
		ResetT(T->Right);
	}
	T->flag=0;
}

void FreeTree(Tree T){
	if(T->Left){
		FreeTree(T->Left);
	}
	if(T->Right){
		FreeTree(T->Right);
	}
	free(T);
}

int main(){
	int N,L,i;
	Tree T;
	scanf("%d",&N);
	while(N){
		scanf("%d",&L);
		T=MakeTree(N);
		for(i=0;i<L;i++){
			if(Judge(T,N)){
				printf("Yes\n");	
			}else{
				printf("No\n");
			}
			ResetT(T);
		}
		FreeTree(T);
		scanf("%d",&N);
	}
	return 0;
}

http://www.niftyadmin.cn/n/5868940.html

相关文章

C++中,关于用 size_t 还是用 int,永远要统一标准。

看以下例子&#xff1a; template<class T> class MyArray {public:T* _pData null; //指针&#xff0c;指向第一个元素size_t _nElementCount 0; //无素个数public:MyArray(const T* pt, const int nLen) { }size_t length() const { return _nElementCount…

HAProxy- https、四层负载实现与 负载均衡关键技术

目录 1、HAProxy实现四层负载 四层负载示例 ACL示例-四层访问控制 2、HAProxy- https实现 HAProxy https实现 证书制作 https配置示例 修改后端服务器的日志格式 验证https 3、 负载均衡关键技术 1、什么是 Session 2、什么是 Session 共享 1、基于 Cookie 的 Ses…

python爬虫学习第十一篇爬取指定类型数据

最近在学习Python爬虫的过程中&#xff0c;尝试用爬虫获取指定类型的数据。今天&#xff0c;我想和大家分享一下我的实践过程和遇到的问题。 一、实现目标 目标是从一个网站的API接口获取不同类型的食品数据。 比如&#xff0c;第一步我想获取汉堡、小食、甜品等不同类型的数…

ROS的action通信——实现阶乘运算(三)

在ROS中除了常见的话题(topic&#xff09;通信、服务(server)通信等方式&#xff0c;还有action通信这一方式&#xff0c;由于可以实时反馈任务完成情况&#xff0c;该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享&#xff0c;实现基于action通信的阶乘运…

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…

【前端基础】Day 1 HTML

总结&#xff1a; 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

【前沿探索篇九】【DeepSeek具身智能:机器人操作学习框架】

第一章 具身智能的"五感觉醒" 1.1 多模态感知的神经交响乐 我们的多模态编码器就像机器人的大脑皮层,把不同传感器数据拧成一股绳: class MultimodalEncoder(nn.Module):def __init__(self):sel

电脑不能正常启动了怎么办?查看解决方法

电脑是我们日常生活和工作中不可缺少的工具&#xff0c;但有时候我们可能会遇到电脑不能正常启动的问题&#xff0c;这会给我们带来很多麻烦和困扰。那么&#xff0c;电脑不能正常启动的原因有哪些&#xff0c;又该如何解决呢&#xff1f;本文将为你介绍几种常见的情况和对应的…