数据结构第六章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
*/
相关推荐
下一站春风里21 分钟前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
DRobot44 分钟前
【机械制图与CAD实战(二十五)】螺纹的表示方法
算法·机械制图
用户老李1 小时前
卡尔曼滤波自学教程 10:无迹卡尔曼滤波(UKF)
算法
深圳市益普科技有限公司2 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
挖井观天2 小时前
《Java数据结构》第一讲:顺序表
数据结构
lhbweilai3 小时前
分析FreeRTOS内核对象API的源码实现(八)
c语言·开发语言·stm32·单片机
程序员清风3 小时前
算法题中的边界条件、测试与调试
开发语言·算法·kotlin
艾络迅Acceleronix4 小时前
环境监测终端:STM32+EG800Z AT+ 艾络迅平台实战|多传感器采集联动全流程
c语言·stm32·单片机·嵌入式硬件·物联网·1024程序员节
炘爚4 小时前
数据结构算法总结
数据结构·python·算法
Zwawa4 小时前
一只按键不只“按下”:短按、长按和连按如何共存
c语言·单片机·嵌入式