- 创建树节点
TreeNode* CreateTreeNode(TreeNodeType value){
TreeNode* new_node = (TreeNode*)malloc(sizeof(TreeNode));
new_node->data = value;
new_node->lchild = NULL;
new_node->rchild = NULL;
return new_node;
}- 销毁树节点
void DestroyTreeNode(TreeNode* node){
free(node);
}- 树的初始化
void TreeInit(TreeNode** pRoot){
if(pRoot == NULL){
//非法输入
return;
}
*pRoot = NULL;
return;
}- 树的先序遍历(递归版本)
void TreePreOrder(TreeNode* root){
if(root == NULL){
printf("#");
return;
}
//先访问根节点
printf("%c",root->data);
//递归遍历左子树
TreePreOrder(root->lchild);
//递归遍历右子树
TreePreOrder(root->rchild);
return;
}- 树的中序遍历(递归版本)
void TreeInOrder(TreeNode* root){
if(root == NULL){
return;
}
//先递归遍历左子树
TreeInOrder(root->lchild);
//访问根节点
printf("%c ",root->data);
//再递归遍历右子树
TreeInOrder(root->rchild);
return;
}- 树的后序遍历(递归版本)
void TreePostOrder(TreeNode* root){
if(root == NULL){
return;
}
//先递归遍历左子树
TreePostOrder(root->lchild);
//然后递归遍历右子树
TreePostOrder(root->rchild);
//访问根节点
printf("%c ",root->data);
return;
}- 树的层序遍历
void TreeLevelOrder(TreeNode* root){
if(root == NULL){
return;
}
//基于链表来操作
SeqQueue queue;
SeqQueueInit(&queue);
SeqQueuePush(&queue,root);
while(1){
SeqQueueType front;
int ret = SeqQueueFront(&queue,&front);
if(ret == 0){
//遍历结束
break;
}
//打印当前值
printf("%c ",front->data);
//把当前队首元素出队列
SeqQueuePop(&queue);
//把当前元素的左右子树入队列
if(front->lchild != NULL){
SeqQueuePush(&queue,front->lchild);
}
if(front->rchild != NULL){
SeqQueuePush(&queue,front->rchild);
}
}
return;
}- 输入一个数组,根据数组内容构建一棵树,数组中的元素内容符合树的先序遍历结果(包含所有的空节点)
TreeNode* TreeCreate(TreeNodeType data[],size_t size,char null_node){
size_t index = 0;
//_TreeCreate为辅助递归函数
return _TreeCreate(data,size,&index,null_node);
}
TreeNode* _TreeCreate(TreeNodeType data[],size_t size,size_t* index,TreeNodeType null_node){
if(index == NULL){
return NULL;
}
if(*index >= size){
return NULL;
}
if(data[*index] == null_node){
//空树
return NULL;
}
//根据index指向的内容创建一个节点
TreeNode* new_node = CreateTreeNode(data[*index]);
//先++index,再递归构建新节点的左子树
++(*index);
new_node->lchild = _TreeCreate(data,size,index,null_node);
//再++index,递归构建新节点的右子树
++(*index);
new_node->rchild = _TreeCreate(data,size,index,null_node);
return new_node;
}- 树的拷贝(深拷贝)
TreeNode* TreeClone(TreeNode* root){
if(root == NULL){
return;
}
//按先序方式遍历
TreeNode* new_node = CreateTreeNode(root->data);
printf("%c ",new_node->data);
new_node->lchild = TreeClone(root->lchild);
new_node->rchild = TreeClone(root->rchild);
return new_node;
}- 树的销毁
void TreeDestroy1(TreeNode** root){//使用后序遍历的顺序销毁
if(root == NULL)
return;
if(*root == NULL)
return;
TreeDestroy1(&((*root)->lchild));
TreeDestroy1(&((*root)->rchild));
DestroyTreeNode(*root);
*root = NULL;
}void TreeDestroy2(TreeNode** root){//使用先序遍历的顺序销毁
if(root == NULL)
return;
if(*root == NULL)
return;
TreeNode* lchild = (*root)->lchild;
TreeNode* rchild = (*root)->rchild;
DestroyTreeNode(*root);
TreeDestroy2(&lchild);
TreeDestroy2(&rchild);
*root = NULL;
}- 求树的节点个数
size_t TreeSize1(TreeNode* root){
if(root == NULL)
return 0;
size_t size = 0;
_TreeSize(root,&size);
return size;
}
void _TreeSize(TreeNode* root,size_t* size){
if(root == NULL || size == NULL)
return;
++(*size);
_TreeSize(root->lchild,size);
_TreeSize(root->rchild,size);
}size_t TreeSize2(TreeNode* root){
if(root == NULL)
return 0;
return 1+TreeSize2(root->lchild)+TreeSize2(root->rchild);
}- 求叶子节点的个数
size_t TreeLeafSize(TreeNode* root){
if(root == NULL)
return 0;
if(root->lchild == NULL && root->rchild == NULL)
return 1;
return TreeLeafSize(root->lchild)+TreeLeafSize(root->rchild);
}- 求第K层的节点个数
size_t TreeKLevelSize(TreeNode* root,int K){
if(root == NULL || K < 1)
return 0;
if(K == 1)
return 1;
return TreeKLevelSize(root->lchild,K-1)+TreeKLevelSize(root->rchild,K-1);
}- 求二叉树的高度/深度/层数
size_t TreeHeight(TreeNode* root){
if(root == NULL)
return;
if(root->lchild == NULL && root->rchild == NULL)
return 1;
size_t lheight = TreeHeight(root->lchild);
size_t rheight = TreeHeight(root->rchild);
return 1+(lheight > rheight ? lheight : rheight);
}- 在二叉树中查找节点,给定一个值,求对应结点的指针(二叉树的节点不重复)
TreeNode* TreeFind(TreeNode* root,TreeNodeType to_find){
if(root == NULL)
return NULL;
if(root->data == to_find)
return root;
TreeNode* lresult = TreeFind(root->lchild,to_find);
TreeNode* rresult = TreeFind(root->rchild,to_find);
return lresult != NULL ? lresult : rresult;
}- 求当前节点的父节点
TreeNode* Parent(TreeNode* root,TreeNode* child){
if(root == NULL || child == NULL)
return NULL;
if(root->lchild == child || root->rchild == child)
return root;
TreeNode* lresult = Parent(root->lchild,child);
TreeNode* rresult = Parent(root->rchild,child);
return lresult != NULL ? lresult : rresult;
}- 求当前节点的左子树
TreeNode* LChild(TreeNode* node){
if(node == NULL)
return NULL;
return node->lchild;
}- 求当前节点的右子树
TreeNode* RChild(TreeNode* node){
if(node == NULL)
return NULL;
return node->rchild;
}测试函数:
#include"bin_tree.h"
#define PRINT_HEAD printf("\n============%s============\n",__FUNCTION__);
void TestInit(){
PRINT_HEAD;
TreeNode* root;
TreeInit(&root);
printf("root expect NULL,actual %p\n",root);
return;
}
void TestPreOrder(){
PRINT_HEAD;
TreeNode* root;
TreeInit(&root);
TreeNode* a = CreateTreeNode('a');
TreeNode* b = CreateTreeNode('b');
TreeNode* c = CreateTreeNode('c');
TreeNode* d = CreateTreeNode('d');
TreeNode* e = CreateTreeNode('e');
TreeNode* f = CreateTreeNode('f');
TreeNode* g = CreateTreeNode('g');
a->lchild = b;
a->rchild = c;
b->lchild = d;
b->rchild = e;
e->lchild = g;
c->rchild = f;
printf("前序遍历为:");
TreePreOrder(a);
printf("\n");
}
void TestInOrder(){
PRINT_HEAD;
TreeNode* root;
TreeInit(&root);
TreeNode* a = CreateTreeNode('a');
TreeNode* b = CreateTreeNode('b');
TreeNode* c = CreateTreeNode('c');
TreeNode* d = CreateTreeNode('d');
TreeNode* e = CreateTreeNode('e');
TreeNode* f = CreateTreeNode('f');
TreeNode* g = CreateTreeNode('g');
a->lchild = b;
a->rchild = c;
b->lchild = d;
b->rchild = e;
e->lchild = g;
c->rchild = f;
printf("中序遍历为:");
TreeInOrder(a);
printf("\n");
}
void TestPostOrder(){
PRINT_HEAD;
TreeNode* root;
TreeInit(&root);
TreeNode* a = CreateTreeNode('a');
TreeNode* b = CreateTreeNode('b');
TreeNode* c = CreateTreeNode('c');
TreeNode* d = CreateTreeNode('d');
TreeNode* e = CreateTreeNode('e');
TreeNode* f = CreateTreeNode('f');
TreeNode* g = CreateTreeNode('g');
a->lchild = b;
a->rchild = c;
b->lchild = d;
b->rchild = e;
e->lchild = g;
c->rchild = f;
printf("后序遍历为:");
TreePostOrder(a);
printf("\n");
}
void TestLevelOrder(){
PRINT_HEAD;
TreeNode* root;
TreeInit(&root);
TreeNode* a = CreateTreeNode('a');
TreeNode* b = CreateTreeNode('b');
TreeNode* c = CreateTreeNode('c');
TreeNode* d = CreateTreeNode('d');
TreeNode* e = CreateTreeNode('e');
TreeNode* f = CreateTreeNode('f');
TreeNode* g = CreateTreeNode('g');
a->lchild = b;
a->rchild = c;
b->lchild = d;
b->rchild = e;
e->lchild = g;
c->rchild = f;
printf("层序遍历为:");
TreeLevelOrder(a);
printf("\n");
}
void TestCreate(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
printf("\n先序遍历为:");
TreePreOrder(root);
printf("\n中序遍历为:");
TreeInOrder(root);
printf("\n后序遍历为:");
TreePostOrder(root);
printf("\n层序遍历为:");
TreeLevelOrder(root);
printf("\n");
}
void TestClone(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
printf("先序遍历为:");
TreeClone(root);
printf("\n");
}
void TestDestroy1(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
TreeDestroy1(&root);
printf("root expect NULL,actaul %p\n",root);
}
void TestDestroy2(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
TreeDestroy2(&root);
printf("root expect NULL,actaul %p\n",root);
}
void TestSize(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
size_t size1 = TreeSize1(root);
printf("size1 expect 7,actual %lu\n",size1);
size_t size2 = TreeSize2(root);
printf("size2 expect 7,actual %lu\n",size2);
}
void TestLeafSize(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
size_t size = TreeLeafSize(root);
printf("size expect 3,actual %lu\n",size);
}
void TestLevelSize(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
size_t size = TreeKLevelSize(root,3);
printf("size expect 3,actual %lu\n",size);
}
void TestHeight(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
size_t size = TreeHeight(root);
printf("size expect 4,actual %lu\n",size);
}
void TestFind(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
TreeNode* result = TreeFind(root,'f');
printf("result expect %p,actual %p\n",root->rchild->rchild,result);
}
void TestParent(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
TreeNode* result = Parent(root,root->rchild->rchild);
printf("result expect %c,actual %c\n",root->rchild->data,result->data);
}
void TestLChild(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
TreeNode* result = LChild(root->lchild);
printf("result expect %c,actual %c\n",root->lchild->lchild->data,result->data);
}
void TestRChild(){
PRINT_HEAD;
TreeNodeType data[] = "abd##eg###c#f##";
TreeNode* root = TreeCreate(data,sizeof(data)/sizeof(data[0])-1,'#');
TreeNode* result = RChild(root->lchild);
printf("result expect %c,actual %c\n",root->lchild->rchild->data,result->data);
}
int main(){
TestInit();
TestPreOrder();
TestInOrder();
TestPostOrder();
TestLevelOrder();
TestCreate();
TestClone();
TestDestroy1();
TestDestroy2();
TestSize();
TestLeafSize();
TestLevelSize();
TestHeight();
TestFind();
TestParent();
TestLChild();
TestRChild();
}结果演示:


这篇博客介绍了二叉树的基本操作,包括创建和销毁节点、树的初始化、四种遍历方式(先序、中序、后序、层序),以及从数组构建树。此外,还讨论了树的深拷贝、节点计数、叶子节点计数、求某层节点数、树的高度计算、查找节点、获取节点的父、左右子节点等功能,并提供了测试和结果展示。
1608

被折叠的 条评论
为什么被折叠?



