随笔 -( 二叉树 )

数据结构随笔——二叉树和五个重要性质 二叉树是最常用的数据结构之一,笔者过去一直将关注点放在复杂的树结构(例如红黑树,自平衡树),认为那些才是树的重要应用,但当重新由基本看起,才发现树的基本定中就隐藏着树这一结构的精髓。尽管是些浅薄蠢笨的理解和推演,但笔者还是满怀兴奋的想要将它记录下来。 一、二叉树的定义二叉树的定义不用多说,很多书本上都有明确的定义,但有些细节是笔者过去所没有注意的,先给出殷人昆教授对于二叉树的基本定义—— 二叉树 阅读详情
二叉搜索树的操作集
BinTree Insert( BinTree BST, ElementType X )
{
	if(BST==NULL)
	{
		BST=(BinTree)malloc(sizeof(BinTree));
		BST->Data=X;
		BST->Left=NULL;
		BST->Right=NULL;
	}
	else
	{
		if(X>BST->Data)
			BST->Right=Insert(BST->Right,X);
		else if(X<BST->Data)
			BST->Left=Insert(BST->Left,X);
	}
	return BST;	
}
BinTree Delete( BinTree BST, ElementType X )
{
	if(BST==NULL)
		printf("Not Found\n");
	else
	{ 
		if(X>BST->Data)
			BST->Right=Delete(BST->Right,X);
		else if(X<BST->Data)
			BST->Left=Delete(BST->Left,X);
		else 
		{
			if(BST->Left&&BST->Right)
			{
				Position tmp=FindMin(BST->Right);
				BST->Data=tmp->Data;
				BST->Right=Delete(BST->Right,BST->Data);
			}
			else
			{
				Position tmp=BST;
				if(BST->Left)
					BST=BST->Left;
				else
					BST=BST->Right;
				free(tmp);
			}
		}
	}
	return BST;
}
Position Find( BinTree BST, ElementType X )
{
	if(BST)
	{
		if(X==BST->Data)
			return BST;
		else if(X>BST->Data)
			return Find(BST->Right,X);
		else
			return Find(BST->Left,X);
 
	}
	return BST;
}
Position FindMin( BinTree BST )
{
    if(BST)
	{
        while(BST->Left)
            BST=BST->Left;
    } 
    return BST; 
} 
Position FindMax( BinTree BST )
{
    if(BST)
	{
        while(BST->Right)
            BST=BST->Right;
    } 
    return BST; 
}
二叉搜索树中的最近公共祖先
int find(Tree T,int x)
{
	if(!T) return 0;
	if(x==T->Key) return 1;
	if(x<T->Key) return find(T->Left,x);
	else return find(T->Right,x);
}                                                         
int LCA( Tree T, int u, int v )
{
	if(!T) return ERROR;
	if(!find(T,u)||!find(T,v)) return ERROR;
	int data=T->Key;
	if((u>data&&v<data)||(u<data&&v>data)) return data;
	if(u==data||v==data) return data;
	if(u>data) return LCA(T->Right,u,v);
	else return LCA(T->Left,u,v);
}
统计二叉树叶子结点个数
int LeafCount(BiTree T)
{
    int count;
    if(T==NULL) count=0;
    else if(T->lchild==NULL&&T->rchild==NULL) count=1;
    else count=LeafCount(T->lchild)+LeafCount(T->rchild);
    return count;
}
二叉树的三种遍历(先序、中序和后序)
void Preorder(BiTree T)
{
	if(T)
	{
		printf(" %c",T->data);
		Preorder(T->lchild);
		Preorder(T->rchild);
	}
}
void Inorder(BiTree T)
{
	if(T)
	{
		Inorder(T->lchild);
		printf(" %c", T->data);
		Inorder(T->rchild);
	}
}
void Postorder(BiTree T)
{
	if(T)
	{
		Postorder(T->lchild);
		Postorder(T->rchild);
		printf(" %c", T->data);		
	}
}
二叉树的非递归遍历
void InorderTraversal( BinTree BT )
{
	BinTree t=BT;
	Stack s=CreateStack();
	while(t||!IsEmpty(s))
	{
		while(t)
		{
			Push(s,t);
			t=t->Left;
		}
		if(!IsEmpty(s))
		{
			t=Pop(s);
			printf(" %c",t->Data);
			t=t->Right;
		}
	}
}
void PreorderTraversal( BinTree BT )
{
    BinTree t=BT;
    Stack s=CreateStack();
    while(t||!IsEmpty(s))
    {
        while(t)
        {
            Push(s,t);
            printf(" %c",t->Data);
            t=t->Left;
        }
        if(!IsEmpty(s))
        {
            t=Pop(s);
            t=t->Right;
        }
    }
}
void PostorderTraversal( BinTree BT )
{
    BinTree t=BT;
    Stack s=CreateStack();
    while(t||!IsEmpty(s))
    {
        while(t)
        {
            Push(s,t);
            t->flag=1;
            t=t->Left;
        }
        if(!IsEmpty(s))
        {
            t=Pop(s);
            if(t->flag==1)
            {
                Push(s,t);
                t->flag = 2;
                t=t->Right;
            }
            else
            {
                printf(" %c",t->Data);
                t=NULL;
            }
        }
    }
} 
是否二叉搜索树
bool IsBST ( BinTree T )
{
    if(T)
	{
        if(T->Left)
		{
            if(T->Left->Data>T->Data) return false;
            if(T->Left->Right)
                if(T->Left->Right->Data>T->Data) return false;
            else return IsBST(T->Left);
        }
        if(T->Right)
		{
            if(T->Right->Data<T->Data) return false;
            if(T->Right->Left)
                if(T->Right->Left->Data<T->Data) return false;
            else return IsBST(T->Right);
        }
    }
    return true;
}
7-41 还原二叉树 (25分)
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+10;
int n;
char a[110],b[110];
struct node
{
	int l;
	int r;
}tree[maxn];
int build(int l1,int r1,int l2,int r2)
{
	if(l1>r1) return -1;
	int root=a[l1],pos=l2;
	while(b[pos]!=root) pos++;
	int len=pos-l2;
	tree[root].l=build(l1+1,l1+len,l2,pos-1);
	tree[root].r=build(l1+len+1,r1,pos+1,r2);
	return root;
}
int look(int root)
{
	if(root==-1) return 0;
	else return max(look(tree[root].l),look(tree[root].r))+1;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	build(1,n,1,n);
	cout<<look(a[1]);
    return 0;
}
7-42 玩转二叉树 (25分)
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define pii pair<int, int>
//#define pdi pair<double,int>
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
const int maxn=1e5+10;
int n,a[110],b[110],ans[110],cnt; 
struct node
{
	int l;
	int r;
}tree[1010];
int build(int l1,int r1,int l2,int r2)
{
	if(l1>r1) return -1;
	int root=b[l2],pos=l1;
	while(a[pos]!=root) pos++;
	int len=pos-l1;
	tree[root].l=build(l1,pos-1,l2+1,l2+len);
	tree[root].r=build(pos+1,r1,l2+len+1,r2);
	return root;
} 
void change(int root)
{
	if(root==-1) return ;
	if(tree[root].l==-1&&tree[root].r==-1) return ;
	swap(tree[root].l,tree[root].r);
	change(tree[root].l);
	change(tree[root].r);
}
void pint(int root)
{
	queue<int>q;
	q.push(root);
	while(q.size())
	{
		int cur=q.front();
		q.pop();
		ans[cnt++]=cur;
		if(tree[cur].l!=-1) q.push(tree[cur].l);
		if(tree[cur].r!=-1) q.push(tree[cur].r);
	}
	for(int i=0;i<cnt;i++)
	{
		if(i==0) printf("%d",ans[i]);
		else printf(" %d",ans[i]);
	}
}
int main( )
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
	build(1,n,1,n);
	change(b[1]);
	pint(b[1]);
	return 0;
}
 
树的遍历(25分)
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define pii pair<int, int>
//#define pdi pair<double,int>
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
const int maxn=1e5+10;
int n,a[110],b[110],ans[110],cnt; 
struct node
{
	int l;
	int r;
}tree[1010];
int build(int l1,int r1,int l2,int r2)
{
	if(l1>r1) return -1;
	int root=a[r2],pos=l1;
	while(b[pos]!=root) pos++;
	int len=pos-l1;
	tree[root].l=build(l1,pos-1,l2,l2+len-1);
	tree[root].r=build(pos+1,r1,l2+len,r2-1);
	return root;
}
void pint(int root)
{
	queue<int>q;
	q.push(root);
	while(q.size())
	{
		int cur=q.front();
		q.pop();
		ans[cnt++]=cur;
		if(tree[cur].l!=-1) q.push(tree[cur].l);
		if(tree[cur].r!=-1) q.push(tree[cur].r);
	}
	for(int i=0;i<cnt;i++)
	{
		if(i==0) printf("%d",ans[i]);
		else printf(" %d",ans[i]);
	}
}
int main( )
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
	build(1,n,1,n);
	pint(a[n]);
	return 0;
}
 
7-44 搜索树判断 (25分)
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=1e5+10;
int n,a[1010];
vector<int>v;
void getv(int l,int r,int flag)
{
	int root=a[l];
	int left=l+1,right=r;
	if(!flag)//原像 
	{
		while(left<=r&&a[left]<root) left++;
		while(right>l&&a[right]>=root) right--;
	} 
	else//镜像 
	{
		while(left<=r&&a[left]>=root) left++;
		while(right>l&&a[right]<root) right--;
	}
	if(left-right!=1) return ;
	getv(l+1,right,flag);
	getv(left,r,flag);
	v.push_back(root);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	getv(1,n,0);
//	cout<<"!!"<<endl;
	if(v.size()!=n)
	{
		v.clear();
		getv(1,n,1);
	}
	if(v.size()==n)
	{
		cout<<"YES"<<endl;
		for(int i=0;i<n;i++)
		{
			if(i==0) cout<<v[i];
			else cout<<' '<<v[i];
		}
	}
	else cout<<"NO"<<endl;
    return 0;
}
7-45 是否完全二叉搜索树 (30分)
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
typedef long long ll;
typedef unsigned long long llu;
const int maxn=1e5+10;
int n,a[110],flag,cnt,tree[1010];
void build(int p,int pos)
{
	if(tree[p]==0) tree[p]=a[pos];
	else
	{
		if(a[pos]>tree[p]) build(p<<1,pos);
		else build(p<<1|1,pos);
	}
	return ;
}
int main( )
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),build(1,i);
	for(int i=1;i<1010;i++)
	{
	    if(tree[i])
		{ 
	 	    if(flag) cout<<" ";
	 	    else flag=1;
			cout<<tree[i];
	 	    cnt=i;
		}
	} 
	if(cnt>n) cout<<endl<<"NO"<<endl;
	else cout<<endl<<"YES"<<endl;
	return 0;
}
算法导论随笔(四):树形结构与二叉树 算法的设计与实现都必须依赖于数据结构。在这篇文章中,我来介绍计算机理论中的最常见的数据结构之一:树。其实,树这种结构,并不只是存在于算法理论中,在计算机的其他领域也有着重要的作用。例如,我们所熟知的C,Java,C++等编程语言的编译器,都离不开树这个结构,因为树在词法分析中起到至关重要的作用。 1.树的定义 在计算机科学中,树是一个用来表示层级结构的抽象模型。一棵树中包含了一些节点(Node),这些节点具有父子关系(Parent-Child relation)。下图中就是一棵树。 树形结构的应用除了前文 阅读详情

相关推荐

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7113

二叉树2随笔

图 判断二叉树是否是完全二叉树 如果有右孩子没有左孩子,返回false 在不违反1的情况下,如果遇到了第一个左右孩子不全的节点,则后续皆是叶子节点 层次遍历(leaf默认为false) 判断是否是满二叉树 先求深度L,再求节点个数N 2的L次方-1=N 判断是否是平衡二叉树 左子树和右子树的深度差不超过1 判断是否是搜索二叉树 ...

一起加油!!! 528

CFturbo 2024保姆级教程:从流量扬程到三维叶轮,手把手搞定离心泵水力设计

本文提供CFturbo 2024离心泵水力设计的全流程实战指南,从流量扬程参数输入到三维叶轮模型导出,详细解析设计步骤与优化技巧。涵盖叶轮尺寸确定、子午面型线设计、叶片角度调整等关键环节,帮助工程师高效完成CAE辅助的离心泵水力设计,提升设计质量与效率。

weixin_42569329的博客 923

LeetCode 题解随笔:二叉树

LeetCode 题解随笔:二叉树 刷题顺序参考:代码随想录

weixin_44114160的博客 1881

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1007

个人顶级AI助手OpenClaw(Clawdbot) - 新手快速入门指南

本文详细介绍了个人顶级AI助手OpenClaw(Clawdbot) 的快速入门指南,包括安装部署和使用配置及注意事项

program哲学 5302

二叉树随笔记录

void InorderTraverse(BitTree T){ if(T){ InorderTraverse(T->lchild) cout<<T->data; InorderTraverse(T-<rchild) } } void InorderTraverse(BitTree T){ StackInit(S) p=T while(p||!EmptyStack(S)){ ...

m0_37684037的博客 144

YOLO11数据增强中的色彩空间变换:HSV、YUV等增强技术的原理、实现与参数调优全解析

摘要 本文介绍了色彩空间的基本概念及其在数据增强中的应用,重点分析了HSV色彩空间的原理与特性。色彩空间作为颜色表示的数学模型,在计算机视觉中具有重要作用,RGB、HSV、YUV等常用色彩空间各有特点。数据增强中的色彩变换能提升模型鲁棒性、缓解数据不平衡并防止过拟合。HSV色彩空间将颜色分为色调(H)、饱和度(S)和明度(V)三个独立分量,更符合人类视觉感知,便于针对性调整图像属性。文章详细阐述了HSV与RGB的转换公式,为YOLO11等目标检测框架的数据增强提供了理论基础。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 286

二叉树随笔

二叉树: 递归遍历 所有递归遍历的方法都可以非递归遍历 需要一个辅助栈 前序遍历: 中序遍历: 先左,右,头 每棵子树,整棵树左边界进栈,边弹出边遍历右树,周而复始。 压1,压2,压4, 弹4,4没有右子树, 弹2,2右右子树,压5,压5的左子树,5没有左子树,所以不用压 弹5,5没有右子树 弹1,1有右子树,压3,3有右子树,压6,6没有左子树, 弹6,6没有右子树, 弹3,3有右子树,压7,7没有子树 弹7 后序遍历: 先进左孩子 求树的最大宽度: 给每一个节点标记层数通过HashMap lev

一起加油!!! 306

Cadence OrCAD Capture CIS元器件管理时ERROR(ORCIS-6454): Temporary part number tracking is turned on报错的解决方法

使用Part manager对工程的元器件进行批量管理时,出现如下图所示的ERROR(ORCIS-6454): Temporary part number tracking is turned on报错其解决方法如下。

fydar的博客 3500

【学前须知】推荐阅读顺序

AUTOSAR学习笔记专栏文章推荐阅读顺序

weixin_47571898的博客 743

数据结构随笔——二叉树基础

一、基本概念 二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。 树的结点(node):包含一个数据元素及若干指向子树的分支; 孩子结点(child node):结点的子树的根称为该结点的孩子; 双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲; 兄弟结点:同一双亲的孩子结点; 堂...

一枚菜鸡 489

aic8800出现insmod: can‘t insert ‘/lib/modules/4.9.191/aic8800_fdrv.ko‘: No such device

2、如果单独编译wifi驱动,则把CONFIG_PLATFORM_UBUNTU?= y都改为CONFIG_PLATFORM_ALLWINNER?1、如果把wifi驱动嵌入到内核编译,则在makefile中加入这一句。后面再修改对应平台的交叉编译链和内核吗路径等。

mantouyouyou的博客 510

【剑指 Offer 随笔】07 重建二叉树

07 重建二叉树 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 1.

qq_42281215的博客 176

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

算法随笔 — 树结构基础 — 二叉树

树结构基础(二叉树)及相关算法

TM_Godspeed的博客 544

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

算法学习随笔 6_二叉树有关算法题

本章记录一些有关栈和队列的一些较为经典或者自己第一次做印象比较深刻的算法以及题型,包含自己作为初学者第一次碰到题目时想到的思路以及网上其他更优秀的思路,本章持续更新中......

P_in_k的博客 1709

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Java随笔】二叉树排序

1

weixin_35695688的博客 264

【刷题随笔】二叉树的中序遍历

二叉树中序遍历的递归和迭代两种方式C语言实现

m0_59350620的博客 461

LeetCode 题解随笔:二叉树(2)

LeetCode 题解随笔:二叉树(2) 刷题顺序参考:labuladong

weixin_44114160的博客 436

C指针与二叉树学习随笔

 // a20140903BinaryTreeNode.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include typedef char ElemType; typedef struct BiTNode {  char data;

u011432711的专栏 371

二叉树学习随笔

对于二叉查找树,抛去深度概念,只是从左向右看,每个节点成员是递增排列的。 所以AVL树在插入时,可以用这种视角,来修补插入带来的不平衡。 伸展树则是在访问某个节点成员时,将此节点成员推倒根节点。在推的过程中,使用AVL树相同的单旋转或双旋转,这个过程中就产生了平衡树的效果。

pplxlee的博客 241

【剑指 Offer 随笔】27 二叉树的镜像 -- 递归or栈

27 二叉树的镜像 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入: 4 / \ 2 7 / \ / \ 1 3 6 9 镜像输出: 4 / \ 7 2 / \ / \ 9 6 3 1 示例 1: 输入:root = [4,2,7,1.

qq_42281215的博客 136

数据结构(Java随笔)—树(二叉树)

树(Tree)结构是一种描述非线性层次关系的的数据结构,树中有一个根结点,根节点下分布着一些互不交叉的子集合(子树) 在一个树结构中,有且只有一个根结点,根结点没有直接前驱; 每个结点有且只有一个直接前驱; 每个结点可以有多个直接后继; 二叉树: 在树结构中,二叉树是最简单的一种形式,对树结构的研究主要是二叉树,二叉树最多只有两个子结点,即左子树与右子树;正因有左右之分,所以二叉树是有序树...

远处 263

javascript/js实现 排序二叉树数据结构 学习随笔

二叉树是一种数据结构。其特点是: 1.由一系列节点组成,具有层级结构。每个节点的特性包含有节点值、关系指针。节点之间存在对应关系。 2.树中存在一个没有父节点的节点,叫做根节点。树的末尾存在一系列没有子节点的节点,称为叶子节点。其他可以叫做中间节点。 3.树的根节点位于第一层,层级数越大,节点位置越深,层级数也叫做树高。 排序二叉树为二叉树的一种类型,其特点是: 1.节点分为左右子树。 ...

weixin_30455365的博客 259
上一篇: PAT甲级 - 1155 Heap Paths (30 分) ( 完全二叉树 + dfs )
下一篇: 计算机算法设计与分析第五章思维导图&&知识点总结 ( 初稿 )
Cosmic_Tree
博客等级 码龄7年 134粉丝 337原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值