编写c++算法求任意二叉树中一条最长的路径,并输出此路径上各结点的值

作者&投稿:保振 (若有异议请与网页底部的电邮联系)
编写求任意二叉树中一条最长的路径的算法,要求输出此路径上各结点的值及路径的长度。~

你要伪码我就帮你弄伪码
不过要用到两个函数
int Depth(BiTree T)/* 深度 */
{
if(T==NULL)
return(0);
return 1+(Depth(T->lchild)>Depth(T->rchild)? Depth(T->lchild):Depth(T->rchild));
//选择左右孩子深度高的然后加上根节点这一层就是深度了
}
void Long(BiTree T)
{
if(T!=NULL)//在T不为空的情况下
{
visit(T->data);//访问节点
if(Depth(T->lchild)>Depth(T->rchild))//判断往左走还是往右走
Long(T->lchild);
else
Long(T->rchild);
}
}
深度就是长度,下面的函数要调用上面的函数
如果要源程序可以联系或是有不懂的可以改的简单些

void LongestPath(BiTree bt)//求二叉树中的第一条最长路径长度
{BiTree p=bt,l[],s[];
//l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点
int i,top=0,tag[],longest=0;
while(p || top>0)
{while(p) {s[++top]=p;tag[top]=0; p=p->Lc;} //沿左分枝向下
if(tag[top]==1) //当前结点的右分枝已遍历
{if(!s[top]->Lc && !s[top]->Rc) //只有到叶子结点时,才查看路径长度
if(top>longest)
{for(i=1;i<=top;i++) l[i]=s[i]; longest=top; top--;}
//保留当前最长路径到l栈,记住最高栈顶指针,退栈
}
else if(top>0) {tag[top]=1; p=s[top].Rc;} //沿右子分枝向下
}//while(p!=null||top>0)
}//结束LongestPath

#include <stdio.h>
#define MaxSize 1000

typedef struct BiTNode {
int data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;

void LongestPath(BiTree bt)//求二叉树中的第一条最长路径长度,并输出最长路径上的节点
{
BiTree p = bt, l[MaxSize], s[MaxSize]; //l, s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点
int i,top = 0, tag[MaxSize], longest = 0;
while (p || top >0)
{
while (p)
{
s[++top] = p;
tag[top] = 0;
p = p->lchild;
} //沿左分枝向下
if (tag[top] == 1) //当前结点的右分枝已遍历
{
if (!s[top]->lchild && !s[top]->rchild) //只有到叶子结点时,才查看路径长度
if (top>longest)
{
for (i = 1; i <= top; i++)
l[i] = s[i];
longest = top;
top--;
}//保留当前最长路径到l栈,记住最高栈顶指针,退栈
}
else if (top>0)
{
tag[top] = 1;
p = s[top]->rchild;
} //沿右子分枝向下
}//while(p!=null||top>0)
int k = 0;
for (k = 0; k < longest; k++)
{
printf("%d ", l[k]->data);
}
}//结束LongestPath

喜欢跟爱一样吗?

csdn论坛 里边有答案

用C语言定义二叉树的二叉链表存储结构,完成二叉树的建立,先序中序后...
答:int leaf=0; //求叶子节点数 int depth(TLNode Tree){ //深度 int s1,s2;if(Tree==NULL)return 0;else{ s1=depth(Tree->lchild);s2=depth(Tree->rchild);if(s1==0 && s2==0) leaf++;return (s1>s2?

C语言中以知二叉树中的结点有839个,求叶子结点怎么求
答:如果这个二叉树为完全二叉树可以采用如下算法:根据“二叉树的第i层至多有2^(i − 1)个结点;深度为k的二叉树至多有2^k − 1个结点(根结点的深度为1)”这个性质:因为2^9-1 < 839 < 2^10-1 ,...

求二叉树遍历算法C语言实现的
答:Status PreOrderTraverse (BiTree T,Status (Visit )(TElemType e )){ // 采用二叉链表存储结构,Visit 是对数据元素操作的应用函数,先序遍历二叉树 T 的递归算法。if (T ){ // 若 T 不为空 if (Visit (T->...

以二叉链表为存储结构,编写一个算法求二叉树中最大结点的值
答:遍历二叉树,求最大值。define UNVAILD_VALUE -32768 int getMaxValue(TreeNode *root){ if (root == NULL)return UNVAILD_VALUE;else { int maxValue = max(getMaxValue(root->left), getMaxValue(root->right))...

请用C语言编写一个函数,实现求二叉树高度的算法,并给出结点结构_百度知 ...
答:typedef int Status;typedef char TElemType;typedef struct BiTNode{ TElemType data;struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;int GetDepth(BiTree T){ if(!T) return 0;else{ int depthLeft = GetDepth( T-...

用c或c++实现遍历二叉树的中序算法,急求
答:printf("%c",b->data);if(b->lchild!=NULL||b->rchild!=NULL){ printf("(");DispBTNode(b->lchild);if(b->rchild!=NULL)printf(",");DispBTNode(b->rchild);printf(")");} } } extern void CreateBT...

中序输出二叉树中各结点的值及其所对应的层次数。 (c++)
答:1、首先第一步二叉树就是每个节点(Node)最多只有两个子节点的树结构,且子树有左右之分,不能任意颠倒顺序,借着就是根据二叉树的特性,便有了二叉排序树.,要注意一般数据以二叉树作为数据结构储存时,都是按照二叉排序树的...

以二叉链表作为存储结构,编写算法,计算二叉树中度为一的结点数目_百度...
答:int Onchild(BiTree T)//单分支节点的 { int num1,num2,n=0;if(T==NULL)return(0);else if((T->lchild==NULL&&T->rchild!=NULL)||(T->lchild!=NULL&&T->rchild==NULL))n=1;num1=Onchild(T->lchild...

从一棵二叉树中查找出所有结点的最大值。
答:int Max(BiTree T)//求最大(递归算法){ if(T==NULL)return 0;if(T!=NULL){ if(T->data>max)max=T->data;Max(T->lchild);Max(T->rchild);} return max;} void main()//主函数 { BiTree Ta;Ta=...

二叉树中序遍历非递归算法(c语言实现)
答:把递归拆开,自己弄个栈来模拟递归就是了 貌似这种技巧没什么实际意义,不过还是写了吧 include <stdio.h> define MAXN 100 /*节点的最大数量,姑且定为100*/ struct Node//二叉树节点 { int data;Node *left,*right...