二叉树定义
二叉树是每个结点最多有两个子树的树结构。二叉树不允许存在度⼤于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
*/