数据结构第六章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
*/
相关推荐
Zootopia62641 分钟前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan1 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_960356382 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah2 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO92 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician2 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.3 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o3 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法
星光开发者4 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
-森屿安年-4 小时前
按身高排序
c++·算法