二叉树的基本操作

二叉树的基本操作

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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值