首页 > 其他分享 >二叉树基本操作代码实现

二叉树基本操作代码实现

时间:2022-12-05 10:47:32浏览次数:29  
标签:结点 return int BiTree 代码 二叉树 printf 基本操作 rchild

#include <stdio.h>
#include <stdlib.h> //exit
#include<malloc.h>
//定义二叉链表结点结构
typedef struct node{
	int   data;
	struct node  *lchild, *rchild;
}BiTree;
//创建二叉链表
BiTree  *CreateBiTree( )
{  
	BiTree  *T;	
	int  x;  
    scanf("%d",&x);
    if(x==0)  T=NULL;
    else 
    {  
		if(!(T=(BiTree*)malloc(sizeof(BiTree))))         
             exit(-1);
        T->data = x;
        T->lchild =CreateBiTree();
        T->rchild =CreateBiTree();
    }
    return T;
}
//先序遍历二叉树
void  Preorder(BiTree  *T )  
{
	if(T)  
	{
		printf("%d",T->data); 
		Preorder( T->lchild );
		Preorder( T->rchild );
	}
}
//中序遍历二叉树
void  Inorder(BiTree  *T )  
{
	if(T)  
	{
		Inorder( T->lchild );
		printf("%d",T->data); 
		Inorder( T->rchild );
	}
}
//后序遍历二叉树
void  Postorder(BiTree  *T )  
{
	if(T)  
	{
		Postorder( T->lchild );
		Postorder( T->rchild );
		printf("%d",T->data); 
	}
}
//计算二叉树的深度
int Depth(BiTree *T)
{   int depl,depr;
    if(T)
    {
	  depl=Depth(T->lchild);
	  depr=Depth(T->rchild);
	  if (depl>=depr) return (depl+1);
	  else return (depr+1);
    }
    else  return 0;
}
//求二叉树结点的个数
int Total(BiTree   *T)
{  
	int  left,right;
    if (T==NULL) return 0;
    left= Total(T->lchild);
    right= Total(T->rchild);
    return 1+left+right;
}
//求结点的双亲结点
int Parent(BiTree  *T,int x)
{ //若返回值为0,则结点不在树中
  //若返回值为1,则找到双亲结点
    if(T)
    {
		if(T->data ==x) 
		{
			printf("该结点为树跟,不存在双亲");
			return 0;
		}
		else if(T->lchild&&T->lchild->data==x||T->rchild&&T->rchild->data==x)
		{
			printf("该结点为的双亲%d",T->data);
			return 1;
		}
		else
		{
			if(Parent(T->lchild, x))
				return 1;
			else
				return Parent(T->rchild, x);
		}
	}
	else return 0;
}
//判定结点所在的层次
int Level(BiTree  *T,int x,int n)
{//若返回值为0,则结点不在树中,否则返回结点的层次
	int lev;
	if(T)
	{
		if(T->data==x) return n;
		lev=Level(T->lchild,x,n+1);
		if(lev)
			return lev;
		else
			return Level(T->rchild,x,n+1);
	}
	else return 0; 
}

void freeTree(BiTree   *T)
{
	BiTree  *ltree,*rtree;
	if(T)
	{
		ltree=T->lchild;
		rtree=T->rchild;
		free(T);
		freeTree(ltree);
		freeTree(rtree);
	}
}


void main()
{
	int sel;
	BiTree   *T;
	int x;
	do{
		printf("┌─────────────────┐\n");
		printf("︳  二叉树的基本操作(二叉链表实现)  ︳\n");
		printf("︳                                  ︳\n");
		printf("︳  1  创建      2、先序遍历        ︳\n");
		printf("︳  3、中序遍历  4、后序遍历        ︳\n");
		printf("︳  5、深度      6、结点个数        ︳\n");
		printf("︳  7、求双亲    8、结点层次        ︳\n");
		printf("︳  9、退出                         ︳\n");
		printf("└─────────────────┘\n");
		printf("请选择:");
		scanf("%d",&sel);
		switch(sel)
		{
		case 1: 
			printf("\n请输入二叉树中的结点:\n");
			T=CreateBiTree();
			break;
		case 2:
			printf("\n先序遍历序列:\n");
			Preorder(T );
			break;
		case 3:
			printf("\n中序遍历序列:\n");
			Inorder(T );
			break;
		case 4:
			printf("\n后序遍历序列:\n");
			Postorder(T );
			break;
		case 5:
			printf("\n二叉树的深度为:%d\n",Depth(T));
			break;
		case 6:
			printf("\n二叉树中结点总数为:%d\n",Total(T));
			break;
		case 7:
			printf("\n请输入一个结点:\n");
			scanf("%d",&x);
			if(!Parent(T,x)) printf("\n未找到双亲");
			break;
		case 8:
			printf("\n请输入一个结点:\n");
			scanf("%d",&x);
			printf("\n该结点层次为:%d\n",Level(T,x,1));
			break;
		case 9:
			freeTree(T);
			return;
		}
		printf("\n按任意键继续....\n");
		getch();
		system("cls");
	}while(1);
	//释放链表
}

//测试数据: 
//1 2 3 0 0 4 5 0 6 0 0 7 0 0 0


标签:结点,return,int,BiTree,代码,二叉树,printf,基本操作,rchild
From: https://www.cnblogs.com/little-monster-lhq/p/16951677.html

相关文章

  • 更新代码出现冲突:incoming change和current change
    incomingchange和currentchangeincomingchange和currentchange1.提交代码时冲突。如果远端代码和本地修改有冲突,是不会拉取代码成功的,也就是说,只有把代码贮藏【......
  • [观点]重构代码的7个阶段
    导读:你曾去想重构一个很老的模块,但是你只看了一眼你就恶心极了。文档,奇怪的函数和类的命名,等等,整个模块就像一个带着脚镣的衣衫褴褛的人,虽然能走,但是其已经让人感到很不舒服......
  • 不用正则,60行代码搞定高效Url重写
     在Url重写的很多方案中,都用到了正则,在页面比较少的情况下,可能看不出什么问题但页面一旦过多,正则的性能凸显,这里给出一个不需要试用正则的方案,当然......
  • JAVA 解压缩代码写法
    packagecom.chinaunicom.asset.common.utils.compress;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.compress.archivers.ArchiveEntry;importorg.......
  • git命令合并分支代码
    合并步骤:例:dev分支合并到master分支1、gitcheckoutmaster             【进入要合并的分支】2、gitpull【拉......
  • 让代码帮我们写代码(一)
    Hello,大家好,又是好久不见,最近太忙了(借口)。看了下日志,有2个月没写文章了。为了证明公众号还活着,今天必须更新一下了。在我们的开发过程中,总有那么些需求是那么的变态。常......
  • 一行代码实现页面全屏黑白
     业内怎么实现css属性兼容性如何兼容IE广发行内是怎么实现的提供一段能兼容几乎所有浏览器的代码,以新对公CRM为例 1、实现页面全屏黑白的示例百度  ......
  • leetcode 101. 对称二叉树 js实现
    给你一个二叉树的根节点 root ,检查它是否轴对称。示例1:输入:root=[1,2,2,3,4,4,3]输出:true示例2:输入:root=[1,2,2,null,3,null,3]输出:false 提示:树......
  • 代码实现中文简体转换繁体程序
    PHP版本<?phpclassutf8_chinese{private$utf8_gb2312;private$utf8_big5;private$data;publicfunction__construct($data){$this->......
  • Stream流处理介绍以及Stream的基本操作
    Stream(流)是一个来自数据源的元素队列,元素是特定类型的对象,形成一个队列。Java中的Stream并不会存储元素,而是按需计算。数据源:流的来源,可以是集合,数组等。和以前的Collec......