题目描述:求给定二叉树的最长路径(若有多条最长路径左子树优先)
如图所示此二叉数最长路径为A->B->D->G,可复制代码后自行验证输出。
【具体思路】(1):对于maxdepth 函数分析
在数据结构中对于求解二叉树最大层数是利用优先递归左子树的方式,maxdepth 先递归调用函数本身找到最深叶子结点,然后每一层从后往前➕1。(注意此处maxdepth 函数每一次调用函数本身时是重新定义m和n,也就是说对于不同的根节点其m和n实际上是反应当前子树的左子树最大深度与右子树最大深度) 在日常学习中我们可能会忽略一点:即此二叉树最大深度代表的就是最长路径。那么我们如何输出这条最长路径。
(2) :对于f函数分析
方法声明:二叉树中大部分操作都是基于递归,但此方法主体未使用递归而是将二叉树最长路径视作一支单链表,采取遍历单链表的形式进行操作。
首先我们需注意一点在maxdepth函数中函数返回类型是int:即此二叉树的最大深度,用i接收此二叉树的最大深度并将最大深度的那条路径视作一支以T为头结点单链表,用for循环进行输出,终止条件是j==i即最深的一支路径已被完全遍历。
#include<iostream>
using namespace std;
typedef struct tnode
{
char data;
struct tnode *lchild;
struct tnode *rchild;
}tnode,*bitree;
int createtree(bitree &T)
{
char a;
cin >> a;
if(a=='#')
T=NULL;
else
{
T=new tnode;
T->data=a;
createtree(T->lchild);
createtree(T->rchild);
}
}
int maxdepth(bitree T)
{
if(T)
{
int x=0,y=0;
x=maxdepth(T->lchild);
y=maxdepth(T->rchild);
if(x>=y)
return x+1;
else
return y+1;
}
}
void way(bitree T,int i)
{
if(T)
{
cout << i << endl;
cout << T->data;
int a,b,j;
for(j=0;j<i;j++)
{
a=maxdepth(T->lchild);
b=maxdepth(T->rchild);
if(a>=b)
{
T=T->lchild;
cout << T->data;
}
else
{
T=T->rchild;
cout << T->data;
}
}
}
}
int main()
{
bitree T;
createtree(T);
int i=maxdepth(T);
way(T,i);
return 0;
}
提醒:这段代码相较于标准答案不如其简洁,但更较易理解。
结尾我想说无论学习编程还是别的,除了天才大部分普通人都会感受很痛苦很难坚持,但雄关漫道真如铁,而今迈步从头越。希望大家不要轻易放弃,就从不要复制这段代码并且尝试自己写出。