当前位置: 首页 > news >正文

数据结构(陈越,何钦铭)第三讲 树(上)

3.1 树与数的表示

3.1.1 顺序查找

在这里插入图片描述

int SequentialSearch(List Tbl,ElementType K){
	int i;
	Tbl->Element[0]=K;
	for(i=Tbl->Length;Tbl->Element[i]!=K;i--);
	return i;
} 

typedef struct LNode *List;
struct LNode{
	ElementType Element[MAXSIZE];
	int Length;
};

3.1.2 二分查找例子

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

在这里插入图片描述

3.1.3 二分查找实现

int BinarySearch(List Tbl,ElementType K){
	int left,right,mid,NoFound=-1;
	left=1;
	right=Tbl->Length;
	while(left<=right){
		mid=(left+right)/2;
		if(K<TBl->Element[mid]){
			right=mid-1;
		}else if(K>Tbl->Element[mid]){
			left=mid+1;
		}else{
			return mid;
		}
		return NotFound;
	}
}

在这里插入图片描述

3.1.4 树的定义和术语

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

3.1.5 树的表示

在这里插入图片描述

3.2 二叉树及存储结构

3.2.1 二叉树的定义及性质

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

3.2.2 二叉树的存储结构

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

在这里插入图片描述

3.3 二叉树的遍历

3.3.1 先序中序后序遍历

在这里插入图片描述

//先序遍历 
void PreOrderTraversal(BinTree BT){
	if(BT){
		printf("%d",BT->Data);
		PreOrderTraversal(BT->Left);
		PreOrderTraversal(BT->Right);
	}
}

在这里插入图片描述

//中序遍历 
void InOrderTraversal(BinTree BT){
	if(BT){
		PreOrderTraversal(BT->Left);
		printf("%d",BT->Data);
		PreOrderTraversal(BT->Right);
	}
}

在这里插入图片描述

//后序遍历 
void PostOrderTraversal(BinTree BT){
	if(BT){
		PreOrderTraversal(BT->Left);
		PreOrderTraversal(BT->Right);
		printf("%d",BT->Data);
	}
}

3.3.2 中序非递归遍历

基本思路:使用堆栈
在这里插入图片描述

//中序遍历非递归
void InOrderTraversal(BinTree BT){
	BinTree T=BT;
	Stack S=CreateStack(MaxSize){
		while(T||!IsEmpty(S)){
			while(T){
				Push(S,T);
				T=T->Left;
			}
			if(!IsEmpty(S)){
				T=Pop(S);
				printf("%5d",T->Data);
				T=T->Right;
			}
		}
	}
} 
//先序遍历非递归
void PreOrderTraversal(BinTree BT){
	BinTree T=BT;
	Stack S=CreateStack(MaxSize){
		while(T||!IsEmpty(S)){
			while(T){
				Push(S,T);
				printf("%5d",T->Data);
				T=T->Left;
			}
			if(!IsEmpty(S)){
				T=Pop(S);
				T=T->Right;
			}
		}
	}
}

3.3.3 层序遍历

在这里插入图片描述

在这里插入图片描述

//层序遍历
void LevelOrderTraversal(BinTree BT){
	Queue Q;
	BinTree T;
	if(!BT){
		return;
	}
	Q=CreateQueue(MaxSize);
	AddQ(Q,BT);
	while(!IsEmptyQ(Q)){
		T=DeleteQ(Q);
		printf("%d\n",T->Data);
		if(T->Left){
			AddQ(Q,T->Left);
		}
		if(T->Right){
			AddQ(Q,T->Right);
		} 
	}
} 

3.3.4 遍历应用例子

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

小白专场

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

#include <stdio.h>
#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1

struct TreeNode{
	ElementType Element;
	Tree Left;
	Tree Right;
}T1[MaxTree],T2[MaxTree]; 

Tree BuildTree(struct TreeNode T[]){
	Tree Root;
	int N,i,t;
	scanf("%d",&N);
	int check[MaxTree];
	char cl,cr;
	if(N){
		for(t=0;t<N;t++){
			check[t]=0;
		}
		for(i=0;i<N;i++){
			scanf(" %c %c %c",&T[i].Element,&cl,&cr);
			if(cl!='-'){
				T[i].Left=cl-'0';
				check[T[i].Left]=1;
			}else{
				T[i].Left=Null;
			}
			if(cr!='-'){
				T[i].Right=cr-'0';
				check[T[i].Right]=1;
			}else{
				T[i].Right=Null;
			}
		}
		for(t=0;t<N;t++){
			if(!check[t]){
				break;
			}
		}
		Root=t;
	}
	return Root;
}

int lsomorphic(Tree R1,Tree R2){
	if((R1==Null)&&(R2==Null)){//全空 
		return 1;
	}
	if((R1==Null)&&(R2!=Null)){//一个空一个不空 
		return 0;
	}
	if(T1[R1].Element!=T2[R2].Element){//当前值不同 
		return 0;
	}
	if((T1[R1].Left==Null)&&(T2[R2].Left==Null)){//都没有左子树 
		return lsomorphic(T1[R1].Right,T2[R2].Right);
	}
	if(((T1[R1].Left!=Null)&&(T2[R2].Left!=Null))&&((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element))){//都存在左子树且值相同,则递归判断左子树和右子树是否同构 
		return (lsomorphic(T1[R1].Left,T2[R2].Left)&&lsomorphic(T1[R1].Right,T2[R2].Right));
	}else{
		return (lsomorphic(T1[R1].Left,T2[R2].Right)&&lsomorphic(T1[R1].Right,T2[R2].Left));//否则判断相互左右子树是否同构 
	}
}

int main(){
	Tree R1,R2;
	R1=BuildTree(T1);
	R2=BuildTree(T2);
	if(lsomorphic(R1,R2)){
		printf("Yes\n");
	}else{
		printf("No\n");
	}
	return 0;
} 

相关文章:

  • 【Vue3 入门到实战】16. Vue3 非兼容性改变
  • 正则表达式(Regular expresssion)
  • linux 安装ftp
  • AOS安装及操作演示
  • java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
  • Git分支管理:从入门到高效协作
  • 2025牛客寒假算法基础集训营1
  • 微信小程序 - 组件
  • ASP.NET Core SixLabors.ImageSharp v3.x 的图像实用程序类
  • 【开发工具】开发一个类postman的idea插件
  • Jenkins 配置 Git Parameter 四
  • 怎么使用服务器运行pySCENIC
  • 无人机信号调制技术原理
  • ESP学习-1(MicroPython VSCode开发环境搭建)
  • Java Virtual Machine(JVM)
  • Sass基础知识以及常用知识整理
  • (一)获取数据和读取数据
  • Android:播放Rtsp视频流的两种方式
  • 【工业安全】-CVE-2022-35561- Tenda W6路由器 栈溢出漏洞
  • 网络技术介绍
  • 屠呦呦当选美国科学院外籍院士
  • 泽连斯基承认乌情报部门刺杀俄军高官
  • 大理杨徐邱再审上诉案宣判:驳回上诉,维持再审一审判决
  • 苏州一季度GDP为6095.68亿元,同比增长6%
  • 修订占比近30%收录25万条目,第三版《英汉大词典》来了
  • 新任海南琼海市委副书记陈明已主持市政府党组全面工作