您的位置:首页 > 其它

二叉树基本操作(输出所有叶子节点到根节点的路径)

2015-11-28 16:53 661 查看
/*
功能:(1)输出二叉树的所有叶子节点
(2)输出所有从叶子节点到根节点的路径
(3)输出(2)中最长的一条路径
作者:pussy
日期:2015-11-28
*/
# include<stdio.h>
# include<malloc.h>

typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;

void LongestPath(BiTree T,char path[],int &pathLength,char longestPath[],int &longestLength);
void createBiTree(BiTree &T);
void AllPath(BiTree T,char path[],int &pathLength);
void DisDeaf(BiTree T);

int main()
{
BiTree T=NULL;
printf("创建二叉树:");
createBiTree(T);
char path[100],longestPath[100];
int pathLength=0,longestLength=0;
printf("树中有以下的叶子节点:");
DisDeaf(T);
printf("\n");
AllPath(T,path,pathLength);
LongestPath(T,path,pathLength,longestPath,longestLength);
printf("最长的路径是:");
for(int i=longestLength;i>=0;i--)
{
printf("%c ",longestPath[i]);
}
printf("\n");
return 0;
}

//创建二叉树
void createBiTree(BiTree &T)
{
char ch=getchar();
//输入字符'#'代表空
if(ch=='#')
T=NULL;
else
{
T=(BiTree)malloc(sizeof(BiNode));
T->data=ch;
T->lchild=T->rchild=NULL;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}

//输出所有叶子节点到根的路径
//当T是空节点,返回上一层,不做处理
//当T是叶子节点,先将T加入路径中,在输出路径
//当T不是叶子节点也不是空节点的时候,将该节点加入路径中
//path中存储从根节点到叶子节点的路径,pathLength是path的长度
void AllPath(BiTree T,char path[],int &pathLength)
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)
{
path[pathLength]=T->data;
printf("%c叶子节点到根节点的路径为: ",T->data);
for(int i=pathLength;i>=0;i--)
printf("%c ",path[i]);
printf("\n");
}
else
{
path[pathLength++]=T->data;
AllPath(T->lchild,path,pathLength);
AllPath(T->rchild,path,pathLength);
pathLength--;
}
}
}

//输出最长路径,算法和输出所有路径相似
//不同的是,遇到叶子节点时,比较当前路径和是否比目前记录的最长路径
//还长,如果是,则更新最长路径。
void LongestPath(BiTree T,char path[],int &pathLength,char longestPath[],int &longestLength)
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)
{
path[pathLength]=T->data;
if(pathLength>longestLength)
{
for(int i=pathLength;i>=0;i--)
{
longestPath[i]=path[i];
}
longestLength=pathLength;
}
}
else
{
path[pathLength++]=T->data;
LongestPath(T->lchild,path,pathLength,longestPath,longestLength);
LongestPath(T->rchild,path,pathLength,longestPath,longestLength);
pathLength--;
}
}
}

void DisDeaf(BiTree T)
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)
printf("%c ",T->data);
DisDeaf(T->lchild);
DisDeaf(T->rchild);
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: