数据结构第六章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
*/
相关推荐
影视飓风TIM2 小时前
Linux下C语言缓冲区原理 + Git版本控制
linux·c语言·git
jarvisuni2 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu2 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7982 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭3 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶3 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展
图灵机z3 小时前
【算法提高课】AcWing 1027. 方格取数 长期攻克提高课-day3(3/219)
算法
hans汉斯3 小时前
计算机科学与应用|改进MeanShift算法在智能监控视频中的应用研究
图像处理·人工智能·功能测试·深度学习·算法·音视频