数据结构和算法(六):二叉树

二叉树

二叉树的性质

  1. 在非空二叉树上,第i层上至多有2i-1个结点(i>=1)
  2. 深度为k的二叉树至多有2k-1个结点(i>=1)
  3. 对任何一颗二叉树,若其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1
  4. n个结点的完全二叉树深度为:log2n向下取整再加1
    在这里插入图片描述

满二叉树

一棵深度为k且有2k-1个结点的二叉树称为满二叉树

完全二叉树

深度为k的满二叉树中编号从1到n的前n个结点构成了一棵深度为k的完全二叉树

二叉树的存储结构

顺序存储的类型定义

#define MAX_SIZE 100
typedef telemtype sqbitree[MAX_SIZE];

链式存储的类型定义

1.二叉链表结点

typedef struct BTNode
{
	ElemType data;
	struct BTNode *Lchild,*Rchild;
}BTNode;

2.三叉链表结点

typedef struct BTNode_3
{
	ElemType data;
	struct BTNode_3 *Lchild,*Rchild,*parent;
}BTNode_3;

二叉树的遍历及其应用

二叉树链表的创建

按满二叉树创建

对每个结点输入i(结点编号)和ch(结点内容)借助一个一维数组S[n],编号为i的结点保存在S[i]中

#define MAX_NODE 50;
typedef struct
{
	char data;
	struct BTNode *Lchild,Rchild;
}BTNode;
BTNode *Create_BTree(void)
{
	BTNode *T,*p,*s[MAX_NODE];
	char ch;
	int i,j;
	while (1)
	{
		scanf("%d",&i)
		if(i==0)
			break;//以编号为0作为结束
		else
			{
			 ch=getchar();
			 p=(BTNode*)malloc(sizeof(BTNode));
			 p->data=ch;
			 p->Lchild=p->Rchild=NULL;
			 S[i]=p;
			 if(i==1)
			 	T=p;
			 else
			{
				j=i/2;//j是i的双亲结点的编号
				if(i%2==0)
					s[j]->Lchild=p;
				else 
					s[j]->Rchild=p;
		    }
		   }
	}
	return(T);
}
先序遍历创建
#define NULLKY ‘?’
#define MAX_NODE 50
typedef struct
{
	char data;
		struct BTNode*Lchild,*Rchild;
}BTNode;
void Preorder_Create_BTree(BTNode **T)
{
	BTNode *p;
	char ch=getchar();
	if(ch==NULLKY)
	{
		P=NULL;
	}
	else
	{
		p=(BTNode*)malloc(sizeof(BTNode));
		p->data=ch;
		Preorder_Create_BTree(p->Lchild);
		Preorder_Create_BTree(p->Rchild);
	}
	*T=p;
}

求二叉树的叶子结点数

#define MAX_NODE 50;
int search_leave(BTNode *T)
{
	BTNode *Stack[MAX_NODE],*p=T;
	int top=0,num=0;
	if(T!=NULL)
	{
		stack[++top]=p;
		while(top>0)
		{
			p=stack[top--];
			if(p->Lchild==NULL&&p->Rchild==NULL)
				num++;
			if(p->Rchild!=NULL)
				stack[++top]=p->Rchild;
			if(p->Lchild!=NULL)
				stack[++top]=p->Lchild;
		}
	}
	return (num);
}

遍历二叉树的深度

#define MAX_NODE 50
int search_depth(BTNode *T)
{
	BTNode *Stack[MAX_NODE],*p=T;
	int front=0;rear=0;depth=0,level;
	//level总是指向访问层的最后一个结点在队列的位置
	if(T!=NULL)
	{
		Queue[++rear]=p;
		level=rear;//根是第一层的最后一个结点
		while(front<rear)
		{
			p=Queue[++front];
			if(p->Lchild!=NULL)
				Queue[++rear]=p;
			if(p->Rchild!=NULL)
				Queue[++rear]=p;
			if(front==level)
			{
				depth++;
				level=rear;
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值