生活的天平本不平衡,只有通过努力改变其偏向。

用递归进行二叉树的三种遍历

2008-10-31

用递归进行二叉树的遍历比较简单,三种遍历分别为前序遍历、中序遍历和后序遍历。在写遍历代码时,被卡在怎么样自动建立一个二叉树这一块。想建成每层按顺序时生成的二叉树,还真有点困难。没想出什么好的办法,就在main中用了比较恶心的办法,手动调用,汗。

我建的二叉树是这样的:

    0
   /    \
  1      2
 /  \    /  \
3    4  5   6

程序运行结果:

前序遍历: 0,1,3,4,2,5,6,
中序遍历: 3,1,4,0,5,2,6,
后序遍历: 3,4,1,5,6,2,0,

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//功能:分别采用三种方法遍历二叉树,前序,中序,后序三种方法遍历。
//作者:lonkil
//网站: Http://Www.VcFans.Com
//日期: 2008-10-31
//===============================================================
#include "stdafx.h"
#include <malloc.h>
 
//定义一个结构保证数据二叉数的一个节点。
typedef struct  _Bin_Tree
{
	_Bin_Tree *pLeft;//左子树
	_Bin_Tree *pRight;//右子树
	int nData;//节点数据
}Bin_Tree;
 
//将一个节点置0
void ZeroNode(Bin_Tree *pNode)
{
	pNode->nData = 0;
	pNode->pLeft = 0;
	pNode->pRight = 0;
}
//生成一个二叉树
void CreateATree(Bin_Tree *pNode,int n)
{
	Bin_Tree *pLeft=0,*pRight=0;
	if ( pNode == 0 ) return;
 
	pLeft = (_Bin_Tree *)malloc( sizeof(Bin_Tree) );
	ZeroNode( pLeft );
	pLeft->nData = n;
	pRight = (_Bin_Tree *)malloc( sizeof(Bin_Tree) );
	ZeroNode( pRight );
	pRight->nData = n+1;
 
	pNode->pLeft = pLeft;
	pNode->pRight = pRight;	
}
 
//释放一个二叉树所占的内存
void ReleaseTree(Bin_Tree **pNode)
{//感谢BaihowFF的提醒,我开始的释放方法是存在问题。
	if ( (*pNode) == 0 ) return;
	ReleaseTree( &((*pNode)->pLeft) );
	ReleaseTree( &((*pNode)->pRight) );
	free( (*pNode) );
	(*pNode) = 0;
}
//前序
void PreOrder(Bin_Tree *pRoot)
{
	if ( pRoot == 0 ) return;
	printf("%d,",pRoot->nData);
	PreOrder(pRoot->pLeft);
	PreOrder(pRoot->pRight);
}
//中序
void InOrder(Bin_Tree *pRoot)
{
	if ( pRoot == 0 ) return;
	InOrder(pRoot->pLeft);
	printf("%d,",pRoot->nData);
	InOrder(pRoot->pRight);
}
//后序
void PostOrder(Bin_Tree *pRoot)
{
	if ( pRoot == 0 ) return;
	PostOrder(pRoot->pLeft);
	PostOrder(pRoot->pRight);
	printf("%d,",pRoot->nData);
}
 
int main(int argc, char* argv[])
{
	Bin_Tree *pRoot=(Bin_Tree *) malloc( sizeof(Bin_Tree) );
	ZeroNode(pRoot);
	pRoot->nData = 0;
	//手工建立深度为3的完全二叉树
	CreateATree( pRoot, 1 );
	CreateATree( pRoot->pLeft,3);
	CreateATree( pRoot->pRight,5);
 
	printf("前序遍历: ");
	PreOrder(pRoot);
	printf("\n");
 
	printf("中序遍历: ");
	InOrder(pRoot);
	printf("\n");
 
	printf("后序遍历: ");
	PostOrder(pRoot);
	printf("\n");
 
	ReleaseTree( &pRoot );
	return 0;
}
作者:lonkil | 分类目录:本站原创编程开发 | 标签:

13 条评论

  1. meng 说道:

    呵呵,明白这个理儿,不过程序就免了吧~~~

  2. Tr0j4n 说道:

    本来没有抱着挑刺的心情来看,既然有了先驱,那我就好好看看代码。节点置0函数不好,pLeft和pRight应该置为NULL,而不是置为0。而且要对节点进行读写,应该是用地址传递符号&吧?

    • lonkil 说道:

      To: Troj4n,
      呵呵,兄弟,貌视是没有问题的哦。
      你看一下NULL的宏定义一般都是0,这个值是用来检测指针是不有效的。
      我只是对指向的地址单位进了操作,所以并不需要传指针地址。
      你看看我说的可对。

    • BaihowFF 说道:

      呵呵…我成先驱了?倒一个…
      不过把NULL写成0确实不是个好习惯…写成0会容易产生是int类型的误解…错倒是没有…

  3. BaihowFF 说道:

    这样释放指针是不对的…
    函数作为参数传递过去的时候只是一个副本…
    如果要通过函数方式释放二叉树的指针应该用指针的指针传递….
    另外没有将指针设置为NULL…有了野指针…

  4. Tr0j4n 说道:

    二叉树不错,基本功。用来当字典用