本文想要实现的操作有:
(1)创建一颗二叉树;
(2)前序、中序、后序分别访问已经创建的二叉树;
(3)学习自定义数据类型,函数重载,引用型指针,指针的指针。
#include "stdafx.h"
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode;
typedef BiTNode* BiTree;//给结构体指针取一个别名
//方法一:BiTree& T, 引用型指针
int CreateBiTree(BiTree& T)
{
char data;
scanf("%c", &data);//由键盘以先序方式输入要创建的二叉树
if(data == '#'){
T = NULL;
}
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = data;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 0;
}
//方法二:BiTree* t, 指针的指针
void CreateBiTree(BiTree* t)
{
char c;
c = getchar();
if(c == '#')
*t = NULL;
else
{
*t = new BiTNode[sizeof(BiTNode)];
(*t)->data = c;//注意操作符运算的先后顺序,所以要加小括号
CreateBiTree(&(*t)->lchild);
CreateBiTree(&(*t)->rchild);
}
}
void Visit(BiTree T){
if(T->data != '#'){
cout<<T->data<<" ";
}
}
void PreOrder(BiTree T){
if(T != NULL){
Visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T){
if(T != NULL){
InOrder(T->lchild);
Visit(T);
InOrder(T->rchild);
}
}
void PostOrder(BiTree T){
if(T != NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T);
}
}
int main(int argc, char* argv[])
{
//对CreateBiTree()函数重载,以两种方法创建二叉树
BiTree T;
CreateBiTree(T);
/* BiTree T;
CreateBiTree(&T); */
cout<<"traversal in preorder:"<<endl;
PreOrder(T); //先序
cout<<endl<<"traversal in inorder:"<<endl;
InOrder(T); //中序
cout<<endl<<"traversal in postorder:"<<endl;
PostOrder(T);//后序
return 0;
}
由键盘按照先序输入要创建的二叉树,当没有结点用#表示:
先序输入结点:ABDH##I##E##CF##G##
程序运行结果: