二叉树的基本操作

二叉树的基本操作

1)编写完成下列功能的函数:(1)构建二叉树;(2)中序遍历二叉树;(3)求二叉树

的深度;(4)求二叉树中叶子结点个数;( 5)求二叉树中结点的个数;(6)求二叉树中度为1 的结点个数。

二叉树的二叉链表存储结构的定义
typedef struct BiTNode { // 结点结构
TElemType data;
struct BiTNode *lchild, *rchild; // 左右孩子指针
} BiTNode, *BiTree;

注意:输入时是利用扩展二叉树的先序序列构造二叉树的二叉链表存储,如树

输入是应为该树的完全二叉树的先序序列:ab##c##
根据树的定义,树的操作多用递归。

#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef struct BiTNode { // 结点结构
   char data;
   struct BiTNode *lchild,*rchild;   // 左右孩子指针
} BiTNode,*BiTree;
void CreateBiTree(BiTree &T)
{//利用扩展二叉树的先序序列构造二叉树的二叉链表存储
   char ch;
   //scanf("%c",&ch);
   ch = getchar();
   if ('#' == ch ) 
   	T=NULL;
   else 
   {
   	T = (BiTree)malloc(sizeof(BiTNode));
   	T->data = ch; // 生成根结点并赋值
   	CreateBiTree(T->lchild);   // 创建左子树
   	CreateBiTree(T->rchild);  // 创建右子树
   }
}
void InOrderTraverse(BiTree T)
{ // 中序遍历二叉树
   if (T) 
   {
   	InOrderTraverse(T->lchild); //中序遍历左子树
   	printf("%c ",T->data);            // 访问根结点
   	InOrderTraverse(T->rchild); //中序遍历右子树
   }    
}
int Depth(BiTree T)
{ //求二叉树的深度
   if (!T) 
   	return 0;
   else 
   { 
   	int d1= Depth(T->lchild); 
   	int d2= Depth(T->rchild);
   	return(1+(d1>d2?d1:d2)); //左子树、右子树深度的最大值+1
   }
}
int Number(BiTree T)
{ //求二叉树上结点个数
   if (!T) 
   	return 0;
   else 
   {  
   	int m1=Number(T->lchild);
   	int m2=Number(T->rchild);
   	return(1+m1+m2);    //左子树上结点数+右子树上结点数+1
   }
}
int Leaf(BiTree T)
{ //求二叉树叶子结点个数
   if (!T) 
   	return 0;
   else  if((!T->lchild)&&(!T->rchild)) 
   	return 1;
   else  //左子树上的叶子数+右子树上的叶子数
   	return(Leaf(T->lchild)+Leaf(T->rchild));                         
}
int Number1(BiTree T)
{ //二叉树上度为1结点个数
   if (!T) 
   	return 0;
   else  if (((!T->lchild) && (T->rchild)) || ((T->lchild) && (!T->rchild))) 
   	return 1;
   else 
   {  
   	int m1=Number1 (T->lchild);
   	int m2=Number1 (T->rchild);
   	return(m1+m2);    
   }
}
void Destory(BiTree T)
{ // 销毁二叉树
   if (T)
   {  
   	Destory (T->lchild );       //销毁遍历左子树
   	Destory (T->rchild );      //销毁遍历右子树
   	free(T);            // 释放结点
   }
}
int main()
{
   int a,k,f,x,i,j,ch;
   	//i1,x1,i2,x3,k,f;
   BiTree T;
   for(k = 0;;k++)
   {
       printf("\n1.创建一个二叉树\n");
   	printf("2.中序遍历二叉树\n");
   	printf("3.二叉树深度\n");
   	printf("4.二叉树节点数\n");
   	printf("5.二叉树叶子节点数\n");
   	printf("6.二叉树度为1节点数\n");
   	printf("7.退出程序\n");
   	printf("输入你的选择:\n");
   	scanf("%d",&a);
   	switch (a)
   	{
   	    case 1:
   			printf("扩展二叉树的先序序列为:\n");
   			scanf("%c",&ch);
   			CreateBiTree(T);
   			break;
   		case 2:
   			printf("中序序列为:\n");
   			InOrderTraverse(T);
   			break;
   		case 3:
   			f = Depth(T);
   			printf("深度为:%d",f);
   			break;
   		case 4:
   			x = Number(T);
   			printf("节点数为:%d",x);
   			break;
   		case 5:
   			 i = Leaf(T);
   			 printf("叶子数为:%d",i);
   			 break;
   		case 6:
   			j = Number1(T);
   			printf("度为1节点数为:%d",j);
   			break;
   		case 7:Destory(T);
   			exit(0);
   	}
   }
   return OK;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种非常重要的数据结构,它的基本操作包括创建、销毁、遍历、查找等。下面是二叉树基本操作的实现方法: 1. 创建二叉树:通过前序遍历的数组构建二叉树,其中 '#' 表示空节点。具体实现方法可以参考引用中的 BinaryTreeCreate 函数。 2. 销毁二叉树:遍历二叉树,依次释放每个节点的内存空间。具体实现方法可以参考引用中的 BinaryTreeDestory 函数。 3. 遍历二叉树二叉树的遍历包括前序遍历、中序遍历、后序遍历和层序遍历。具体实现方法可以参考引用中的 BinaryTreePrevOrder、BinaryTreeInOrder、BinaryTreePostOrder 和 BinaryTreeLevelOrder 函数。 4. 查找二叉树节点:在二叉树中查找值为 x 的节点,具体实现方法可以参考引用中的 BinaryTreeFind 函数。 5. 计算二叉树节点个数:计算二叉树中节点的个数,具体实现方法可以参考引用[2]中的 BinaryTreeSize 函数。 6. 计算二叉树叶子节点个数:计算二叉树中叶子节点的个数,具体实现方法可以参考引用中的 BinaryTreeLeafSize 函数。 7. 计算二叉树第 k 层节点个数:计算二叉树中第 k 层节点的个数,具体实现方法可以参考引用中的 BinaryTreeLevelKSize 函数。 8. 判断二叉树是否是完全二叉树:判断二叉树是否是完全二叉树,具体实现方法可以参考引用中的 BinaryTreeComplete 函数。 9. 计算二叉树的深度:计算二叉树的深度,具体实现方法可以参考引用中的 BinaryTreeDeep 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值