用递归进行二叉树的三种遍历
用递归进行二叉树的遍历比较简单,三种遍历分别为前序遍历、中序遍历和后序遍历。在写遍历代码时,被卡在怎么样自动建立一个二叉树这一块。想建成每层按顺序时生成的二叉树,还真有点困难。没想出什么好的办法,就在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; } |
13 条评论
呵呵,明白这个理儿,不过程序就免了吧~~~
系统分析师都知道理的,这有我们这些苦力才知道程序。哈哈
本来没有抱着挑刺的心情来看,既然有了先驱,那我就好好看看代码。节点置0函数不好,pLeft和pRight应该置为NULL,而不是置为0。而且要对节点进行读写,应该是用地址传递符号&吧?
To: Troj4n,
呵呵,兄弟,貌视是没有问题的哦。
你看一下NULL的宏定义一般都是0,这个值是用来检测指针是不有效的。
我只是对指向的地址单位进了操作,所以并不需要传指针地址。
你看看我说的可对。
呵呵…我成先驱了?倒一个…
不过把NULL写成0确实不是个好习惯…写成0会容易产生是int类型的误解…错倒是没有…
哈哈。没事欢迎指错和找岔。
我比较懒就没有
#define NULL 0
说实话,应该是我浅陋。在我接触过的任何程序中,都没有见过将指针置空是通过赋0值来实现的喔
哈哈,是我懒的原因。不好意思,下次注意。
这样释放指针是不对的…
函数作为参数传递过去的时候只是一个副本…
如果要通过函数方式释放二叉树的指针应该用指针的指针传递….
另外没有将指针设置为NULL…有了野指针…
谢谢,你的提醒。
是我疏忽了。
我改过来。
二叉树不错,基本功。用来当字典用
树是个好东西。