2 回答
TA贡献1155条经验 获得超0个赞
这是我写的一个关于二叉树的查找遍历的程序,你可以参考一下
#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char TElemType;
typedef int Status;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)
{
TElemType c;
cin>>c;
if(c=='#') T=NULL;
else
{
T=new BiTNode;
T->data=c;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
Status visitT(TElemType e)
{ int c;
printf("%c",c);
return OK;
}
Status PreOrderTraverse(BiTree T){
if(T){
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
return OK;
}
else
return ERROR;
}
Status InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
return OK;
}
else
return ERROR;
}
Status PostOrderTraverse(BiTree T){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
return OK;
}
else
return ERROR;
}
int NodeCount(BiTree T ){
if(T==NULL)
return 0; // 如果是空树,则结点个数为0
else
return(1+NodeCount(T->lchild)+ NodeCount(T->rchild));
//否则结点个数为1+左子树的结点个数+右子树的结点个数
}
int LeafNodeCount(BiTree T ){
if(T==NULL) //如果是空树,则叶子个数为0;
return 0;
else
{
if(NodeCount(T)==1)
return 1; //如果是叶子结点,则叶子结点个数为1(如何表示叶子结点???)
else
return (LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild));
//否则叶结点个数为左子树的叶结点个数+右子树的叶结点个数
}
}
int Depth(BiTree T){
int m,n;
if(T==NULL) //如果是空树,则深度为0;
return 0;
else{ //否则
m=Depth(T->lchild); //(1) 计算左子树的深度记为m;
n=Depth(T->rchild); //(2) 计算右左子树的深度记为n;
if(m>n)
return(m+1); //二叉树的深度为m 与n的较大者加1
else
return(n+1);
}
}
int exchange(BiTree T)
{
struct BiTNode *t;
if(T==NULL) return 0;
else
{
t=T->lchild;
if(T->lchild!=NULL)
exchange(T->lchild);
if(T->rchild!=NULL)
exchange(T->rchild);
T->lchild=T->rchild;
T->rchild=t;
return OK;
}
}
void main()
{
BiTree T;
cout<<"请按先序遍历的顺序输入一棵二叉树:"<<endl;
CreateBiTree(T);
cout<<"先序遍历的结果为:";
PreOrderTraverse(T);
cout<<endl;
cout<<"中序遍历的结果为:";
InOrderTraverse(T);
cout<<endl;
cout<<"后序遍历的结果为:";
PostOrderTraverse(T);
cout<<endl;
cout<<"结点数为:";
cout<<NodeCount(T)<<endl;
cout<<"叶子结点数为:";
cout<<LeafNodeCount(T)<<endl;
cout<<"树的深度为:";
cout<<Depth(T)<<endl;
exchange(T);
cout<<"左右孩子交换后的结果--先序遍历为:";
PreOrderTraverse(T);
cout<<endl;
cout<<"左右孩子交换后的结果--中序遍历为:";
InOrderTraverse(T);
cout<<endl;
cout<<"左右孩子交换后的结果--后序遍历为:";
PostOrderTraverse(T);
cout<<endl;
}
TA贡献1921条经验 获得超9个赞
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct shu{
struct shu *lp,*rp;
char ch;
}shu,*bishu,;
////////////////////////创建///////////////////////////////////
int creat(bishu &t)
{
char ch;
ch=getchar();
if(ch==' ')
t=NULL;
else
{
if(!(t=(struct shu *)malloc(sizeof(struct shu))))
exit(0);
(*t).ch=ch;
creat((*t).lp);
creat((*t).rp);
}
return 1;
}
///////////////////////////////遍历(递归)////////////////////////
int traverse(struct shu *t)
{
if(t==NULL)
return 1;
printf("%c ",(*t).ch);
traverse((*t).lp);
traverse((*t).rp);
return 1;
}
/////////////////////////////层序遍历////////////////////////////
int ftraverse(struct shu *t)
{
int i=1,length=1;
shu tree[100];
if(t==NULL)
return 0;
while(1)
{
if(t!=NULL)
{printf("%c ",(*t).ch);
i++;length--;
tree[i+length].rp=(*t).lp;
length++;
tree[i+length].rp=(*t).rp;
length++;
t=tree[i].rp;
}
else
{i++;t=tree[i].rp;length--;}
if(t==NULL&&length!=0)
return 0;;
}
}
/////////////////////////////遍历(非递归)/////////////////////
int mtraverse(struct shu *t)
{
int i=0;
shu tree[100];
if(t==NULL)
return 1;
printf("%c ",(*t).ch);
tree[i++].rp=(*t).rp;
t=(*t).lp;
while(i!=-1)
{
if(t!=NULL)
{
printf("%c ",(*t).ch);
tree[i++].rp=(*t).rp;
t=(*t).lp;
}
else
{
t=tree[--i].rp;
}
}
return 0;
}
/////////////////////////主函数///////////////////////////////////
int main()
{
bishu t;
creat(t);
mtraverse(t);
printf("\n");
ftraverse(t);
printf("\n");
traverse(t);
system("pause");
return 0;
}
- 2 回答
- 0 关注
- 111 浏览
添加回答
举报