题目:
求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。
描述
设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径。
输入
一行数据,为二叉树的先序序列(序列中元素为‘#’时,表示该结点为空)。
输出
第一行为二叉树的最长路径长度,第二行为此路径上从根到叶结点的各结点的值。
思路:(递归)
- 函数longest_path(BiTree T,int *path,int &len,int *longestpath,int &longest_len)
//char path[] 每次循环得到的路径
//char longestpath[]最长路径
//int &longest_len最长路径的大小
//int &len每次循环得到的路径的大小 - 代码运行时:遇到的不是叶子结点,该条路径继续
path[len++]T->data;再递归调用该函数,这个节点的左子树,右子树; - 遇到的时叶子结点时,该条路径结束,与之前的最长路径比较,更新最长路径(可能会);
求最长路径算法(核心代码)
void longest_path(BiTree T,int *path,int &len,int *longestpath,int &longest_len)
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)//当遇到叶子结点时,该条路径完毕
{
path[len]=T->data;
if(len>longest_len)//如果长于longest_len就替换
{
for(int j=0;j<=len;j++)
{
longestpath[j]=path[j];
}
longest_len=len;//longest_len更新
}
}
else//当遇到的不是叶子结点时,该条路径继续
{
path[len++]=T->data;
longest_path(T->lchild ,path,len,longestpath,longest_len);
longest_path(T->rchild ,path,len,longestpath,longest_len);
len--;
}
}
}
全部可执行代码
#include<stdio.h>
#include<bits/stdc++.h>
#define MAX 200
typedef char TElemType;
typedef int status;
typedef struct BiNode
{
TElemType data;
struct BiNode *lchild;
struct BiNode *rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree &T)//二叉树的先序创建
{
TElemType ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T=(BiNode*)malloc(sizeof(BiNode));
if(!T)
exit(-1);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void longest_path(BiTree T,int *path,int &len,int *longestpath,int &longest_len)
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)//当遇到叶子结点时,该条路径完毕
{
path[len]=T->data;
if(len>longest_len)//如果长于longest_len就替换
{
for(int j=0;j<=len;j++)
{
longestpath[j]=path[j];
}
longest_len=len;//longest_len更新
}
}
else//当遇到的不是叶子结点时,该条路径继续
{
path[len++]=T->data;
longest_path(T->lchild ,path,len,longestpath,longest_len);
longest_path(T->rchild ,path,len,longestpath,longest_len);
len--;
}
}
}
int main()
{
BiTree T;
printf("创建树输入树T的先序序列(其中使用#代表空节点)\n");
CreateBiTree(T);
int path[MAX]={0};
int longestpath[MAX]={0};
int len=0;
int longest_len=0;
longest_path(T,path,len,longestpath,longest_len);
printf("第一条最长的路径长度为:%d\n",longest_len);
printf("路径为:");
for(int i=0;i<=longest_len;i++)
{
printf("%c ->",longestpath[i]);
}
printf("NULL");
}


版权声明:本文为qq_50675813原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。