如果需要C++实现的版本请移步C++版本
这里只实现了二叉树的先序方式建立和三种遍历方法。其中遍历时使用了函数作为参数(当时正在学习这一部分,所以看起来可能比较复杂)但代码的逻辑十分简单。函数指针的用法移步函数指针
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
typedef struct _BinTreeNode
{
ElemType data;
struct _BinTreeNode *lchild;
struct _BinTreeNode *rchild;
}BinTreeNode, *BiTree;
void PrintNode(ElemType elem)
{
cout<<elem<<',';
}
void preOrderTraverse(BiTree &pNode, void (*Visit)(ElemType elem))
{
if(NULL != pNode)
{
Visit(pNode->data);
preOrderTraverse(pNode->lchild, PrintNode);
preOrderTraverse(pNode->rchild, PrintNode);
}
}
void inOrderTraverse(BiTree &pNode, void (*Visit)(ElemType elem))
{
if(NULL != pNode)
{
preOrderTraverse(pNode->lchild, PrintNode);
Visit(pNode->data);
preOrderTraverse(pNode->rchild, PrintNode);
}
}
void postOrderTraverse(BiTree &pNode, void (*Visit)(ElemType elem))
{
if(NULL != pNode)
{
preOrderTraverse(pNode->lchild, PrintNode);
preOrderTraverse(pNode->rchild, PrintNode);
Visit(pNode->data);
}
}
void precreateBinTree(BiTree &T)
{
ElemType elem;
cin>>elem;
if(9999 == elem)
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BinTreeNode));
T->data = elem;
precreateBinTree(T->lchild);
precreateBinTree(T->rchild);
}
}
int main()
{
BiTree T;
precreateBinTree(T);
preOrderTraverse(T,PrintNode);
cout<<endl;
inOrderTraverse(T,PrintNode);
cout<<endl;
return 0;
}
测试结果
1
2
9999
3
9999
9999
4
9999
9999
1,2,3,4,
2,3,1,4,