数据结构的东西平时工作中用得不是很多,大部分的结构都有已经存在的实现,工作中拿来用用就可以,时间长了有些知识就忘记了,有必要做一下复习,正好这两天手上的开发任务不是太重,就简单复习了一下二叉树相关的知识,编写了测试程序,主要实现了如下功能:
1.先序创建二叉树
2.前,中,后序遍历二叉树
3.反转二叉树
4.计算节点总数
5.计算叶节点数
现将代码及运行结果贴出,以作备忘,也欢迎各位大侠提提意见,帮助提高,谢谢。
源代码(binary-tree.c):
/* ./binary-tree < input */
#include <stdio.h>
#include <stdlib.h>
typedef struct _Node Node;
struct _Node
{
int data;
Node *l;
Node *r;
};
//Preorder Creation
Node *create()
{
int a = 0;
Node *p;
scanf("%d", &a);
if(0 != a)
{
p = (Node *)malloc(sizeof(Node));
p->data = a;
p->l = create();
p->r = create();
}
else
{
p = NULL;
}
return p;
}
//Postorder Traversal
void postorder_traversal(Node *p)
{
if(NULL != p)
{
postorder_traversal(p->l);
postorder_traversal(p->r);
printf("%d ", p->data);
}
}
//Preorder Traversal
void preorder_traversal(Node *p)
{
if(NULL != p)
{
printf("%d ", p->data);
preorder_traversal(p->l);
preorder_traversal(p->r);
}
}
//Inorder Traversal
void inorder_traversal(Node *p)
{
if(NULL != p)
{
inorder_traversal(p->l);
printf("%d ", p->data);
inorder_traversal(p->r);
}
}
int leaves(Node *p)
{
if(NULL == p)
return 0;
if((NULL == p->l) && (NULL == p->r))
return 1;
else
return leaves(p->l) + leaves(p->r);
}
int nodes(Node *p)
{
if(NULL == p)
return 0;
if((NULL == p->l) && (NULL == p->r))
return 1;
else
return nodes(p->l) + nodes(p->r) + 1;
}
Node *swap(Node *p)
{
Node *tmp = NULL;
if(NULL == p)
return p;
tmp = p->l;
p->l = p->r;
p->r = tmp;
swap(p->l);
swap(p->r);
return p;
}
int main(int argc, char **argv)
{
Node *p = create();
printf("Number of leaves is: %d\n", leaves(p));
printf("Number of nodes is: %d\n", nodes(p));
printf("Postorder Traversal:\n");
postorder_traversal(p);
printf("\nPreorder Traversal:\n");
preorder_traversal(p);
printf("\nInorder Traversal:\n");
inorder_traversal(p);
printf("\nSWAP\n");
swap(p);
printf("Postorder Traversal:\n");
postorder_traversal(p);
printf("\nPreorder Traversal:\n");
preorder_traversal(p);
printf("\nInorder Traversal:\n");
inorder_traversal(p);
printf("\n");
return 0;
}
输入文件input的内容:
1
2
4
0
0
0
3
5
0
0
6
0
0
编译 (gcc-4.5.2 on Ubuntu 11.04 LTS):
gcc -o binary-tree binary-tree.c
运行:
$ ./binary-tree < input
Number of leaves is: 3
Number of nodes is: 6
Postorder Traversal:
4 2 5 6 3 1
Preorder Traversal:
1 2 4 3 5 6
Inorder Traversal:
4 2 1 5 3 6
SWAP
Postorder Traversal:
6 5 3 4 2 1
Preorder Traversal:
1 3 6 5 2 4
Inorder Traversal:
6 3 5 1 2 4