链表
参看此线性表实现(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)