C语言链表、树、图的实现(结构体)

链表、树、图

链表

参看此线性表实现(C语言——结构体)博文

struct Tree{
   
	int val;
	struct Tree *left;
	struct Tree *right;
};

在上面的代码中,每一部分都是定义二叉树节点所必需的,所以没有多余的可以删除的部分。但是,如果你想简化代码或使其更加清晰,你可以考虑下面:

使用typedef的同时定义结构体,这样可以避免在结构体内部重复使用struct关键字。这是C语言中常见的做法:

typedef struct TreeNode {
   
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
} TreeNode;

在这个例子中,虽然你在结构体内部还是用了struct TreeNode,但是在定义完结构体之后,你可以直接使用TreeNode来声明变量,而不需要再次使用struct关键字。

然而,有些C编译器(如GCC和Clang)支持一种扩展语法,允许你在typedef的同时,也在结构体内部使用新定义的别名,而不需要前缀struct。这种写法在C++中是标准的,但在C中只是某些编译器的扩展:

typedef struct TreeNode {
   
    int val;
    TreeNode *left;  // 注意这里直接使用TreeNode而不是struct TreeNode
    TreeNode *right; // 同上
} TreeNode;

如果你确定你的编译器支持这种扩展语法,并且你希望代码更加简洁,你可以选择使用这种写法。但是,为了保持代码的可移植性,最好还是坚持使用标准的C语法,即在结构体内部使用struct TreeNode

总结来说,你的原始代码已经是定义二叉树节点的标准方式,没有任何可以删除的部分,除非你打算使用编译器的特定扩展。

示例

#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
   
	int data;
	TreeNode *left;
	TreeNode *right;
};
//初始化根节点
void start(TreeNode *p,int a){
   
	p->data=a;
	p->left=NULL;
	p->right=NULL;
} 
//添加左子树
void addleft(TreeNode *p, TreeNode *a,int b){
   
	p->left=a;
	a->data=b;
	a->left=NULL;
	a->right=NULL;
} 
//添加右子树
void addright(TreeNode *p, TreeNode *a,int b){
   
	p->right=a;
	a->data=b;
	a->left=NULL;
	a->right=NULL;
} 
//以下的函数命名不规范,不能以中文拼英为名称,只做举例使用
//先序遍历
void Xian(TreeNode *p){
   
	if(p!=NULL){
   
		printf("%d",p->data);
	    Xian(p->left);
	    Xian(p->right);
	}
}
//中序遍历
void Zhong(TreeNode *p){
   
	if(p!=NULL){
   
	    Zhong(p->left);
	    printf("%d",p->data);
	    Zhong(p->right);
	}
}
//后序遍历
void Hou(TreeNode *p){
   
	if(p!=NULL){
   
	    Hou(p->left);
	    Hou(p->right);
	    printf("%d",p->data);
	}
}
//判断两棵树是否相同 
bool isSameTree(TreeNode* p, TreeNode* q)
  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值