二叉树知识复习

数据结构的东西平时工作中用得不是很多,大部分的结构都有已经存在的实现,工作中拿来用用就可以,时间长了有些知识就忘记了,有必要做一下复习,正好这两天手上的开发任务不是太重,就简单复习了一下二叉树相关的知识,编写了测试程序,主要实现了如下功能:

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 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值