数据结构第六章c语言 树的存储下二叉树的概念和存储

二叉树定义

二叉树是每个结点最多有两个子树的树结构。二叉树不允许存在度⼤于2的树。

它有五种最基本的形态:

二叉树可以是空集

根可以有空的左子树或者右子树;

左右子树都是空。只有左子树或者右子树的叫做斜树。

2.2.1 完全二叉树和满二叉树

满二叉树

在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都

在同一层上,这样的二叉树称为满二叉树。

一棵深度为k且有2k

-1个结点的二叉树称为满二叉树。( k ≥ 1)

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
//二叉链表的结点结构 
typedef struct Node
{
	char data;
	struct Node* l;//指向左孩子
	struct Node* r;//指向右孩子
	struct Node* fa;//指向右孩子
}BTNode,*BTree;

BTree InitBTree(char r)
{
	BTNode* s=(BTNode* )malloc(sizeof(BTNode));
	//if(s==NULL)
	s->data=r;
	s->l=s->r=NULL;
	s->fa=NULL;
	return s;

}
BTNode* Find(BTree root,char fx)
{
	if(root->data==fx)
	{
		return root;
	}

	BTNode* ans=NULL;
	if(root->l!=NULL)
	{

		ans=Find(root->l,fx);
		if(ans!=NULL)
		{
			return ans;
		}
	}
	if(root->r!=NULL)
	{

		ans=Find(root->r,fx);
		if(ans!=NULL)
		{
			return ans;
		}
	}
	return NULL;

}
BTree Insert(BTree root,char x,char fx,int flag)
{
	BTNode* f=Find(root,fx);
	BTNode* s=(BTNode* )malloc(sizeof(BTNode));
	//if(s==NULL)
	s->data=x;
	s->l=s->r=NULL;
	s->fa=f;
	
	if(flag==0)f->l=s;
	else f->r=s;
	return root;
}
int main()
{
	int n;
	char r;
	scanf("%d",&n);
	getchar();
	scanf("%c",&r);
	BTree root=InitBTree(r);
	char x,fx;
	int flag;//=0 左孩子。=1 右孩子
	for(int i=1;i<=n-1;i++)
	{
		getchar();
		scanf("%c %c %d",&x,&fx,&flag);//x是fx的孩子
		root=Insert(root,x,fx,flag);
	}
	getchar();
	scanf("%c",&x);
	BTNode* p=Find(root,x);
	if(p->l!=NULL)printf("左孩子是%c\n",p->l->data);
	if(p->r!=NULL)printf("右孩子是%c\n",p->r->data);

	if(p->fa==NULL)printf("该结点是根结点\n");
	else printf("双亲结点是%c\n",p->fa->data);

	
	
	return 0;
 } 
/*
7
a
b a 0
c a 1
d b 0
e b 1
f e 0
g e 1
*/
cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#define maxx 1005
int flag;//=0 左孩子。=1 右孩子
char data[maxx];
int Find(char fx)
{
	int i;
	for(i=1;i<maxx;i++)
	{
		if(data[i]==fx)
		{
			break;
		}
	}
	return i;
}
int main()
{
	int n;
	char r;
	//避免补上的NULL结点的影响 
	for(int i=0;i<maxx;i++)
	data[i]=' ';

	scanf("%d",&n);
	getchar();
	scanf("%c",&r);
	data[1]=r;
	char x,fx;
	for(int i=1;i<=n-1;i++)
	{
		getchar();
		scanf("%c %c %d",&x,&fx,&flag);//x是fx的孩子
		int fxi=Find(fx);
	
		if(flag==0)
		{
			data[fxi*2]=x;

		}
		else
		{
			data[fxi*2+1]=x;
		}

	}
	
	getchar();
	scanf("%c",&x);
	int i=Find(x);
	//父亲
	if(i/2==0)
	{
		printf("该结点是根结点\n");
	}
	else
	{
		printf("该结点的父亲是:%c\n",data[i/2]);
	}
	//找孩子
	printf("该结点的左孩子是%c,右孩子是%c\n",data[i*2],data[i*2+1]);


	return 0;
 } 
/*
7
a
b a 0
c a 1
d b 0
e b 1
f e 0
g e 1
*/
相关推荐
小O的算法实验室3 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
小飞学编程...3 小时前
【哈希表】
数据结构·哈希算法·散列表
Tbisnic4 小时前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
Brilliantwxx4 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
空堂与归5 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing5 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习6 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨6 小时前
基础数论总结
笔记·学习·算法
动词ing7 小时前
【C语言】结构体+文件基础
c语言·开发语言·数据结构
caimouse7 小时前
ReactOS 窗口系统分析(7):分层窗口与绘制辅助 — layered.c + draw.c
c语言·开发语言