求二叉树中从根结点到叶子节点的路径

对于二叉树,分别用递归和非递归的方法编写程序完成如下功能:
1. 输出所有的叶子结点的数据项值。
2. 输出所有从叶子节点到根结点的路径
3. 输出(2)中的第一条最长的路径

b=NULL;     //建立的二叉树初始时为空

ch=str[j];

while(ch!='\0'){    //str未扫描完时循环

switch(ch){

case '(':top++;St[top]=p;k=1;break;     //为左结点

case ')':top--;break;

case ',':k=2;break;     //为右结点

default :p=(BTNode *)malloc(sizeof(BTNode));

p->data=ch;

p->lchild=p->rchild=NULL;

if(b==NULL)

b=p; //p指向二叉树的根结点

else{

switch(k){

case 1:St[top]->lchild=p;break;

case 2:St[top]->rchild=p;break;

}

int main(){

BTNode *b;

ElemType path[MaxSize],longpath[MaxSize];

int i,longpathlen=0;

CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");

printf("二叉树b:");DispBTNode(b);printf("\n\n");

printf("b的叶子结点:");DispLeaf(b);printf("\n\n");

printf("AllPath:\n");AllPath(b);printf("\n");

printf("AllPath1:\n");AllPath1(b,path,0);printf("\n");

LongPath(b,path,0,longpath,longpathlen);

printf("第一条最长路径长度:%d\n",longpathlen);

printf("第一条最长路径:");

for(i=longpathlen;i>=0;i--)

printf("%c ",longpath[i]);

printf("\n");

return 0;

}

扩展资料;

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。

设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有三种情况:DLR(称为先根次序遍历),LDR(称为中根次序遍历),LRD (称为后根次序遍历)。

参考资料来源:百度百科-二叉树

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-24
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node{
    ElemType data;      //数据元素
    struct node *lchild;    //指向左孩子
    struct node *rchild;    //指向右孩子
}BTNode;
void CreateBTNode(BTNode *&b,char *str){    //由str串创建二叉链
    BTNode *St[MaxSize],*p=NULL;
    int top=-1,k,j=0;
    char ch;
    b=NULL;     //建立的二叉树初始时为空
    ch=str[j];
    while(ch!='\0'){    //str未扫描完时循环
        switch(ch){
            case '(':top++;St[top]=p;k=1;break;     //为左结点
            case ')':top--;break;
            case ',':k=2;break;     //为右结点
            default :p=(BTNode *)malloc(sizeof(BTNode));
                    p->data=ch;
                    p->lchild=p->rchild=NULL;
                    if(b==NULL)
                        b=p;        //p指向二叉树的根结点
                    else{
                        switch(k){
                            case 1:St[top]->lchild=p;break;
                            case 2:St[top]->rchild=p;break;
                        }
                    }
        }
        j++;
        ch=str[j];
    }
}
void DispBTNode(BTNode *b){     //以括号表示法输出二叉树
    if(b!=NULL){
        printf("%c",b->data);
        if(b->lchild!=NULL || b->rchild!=NULL){
            printf("(");
            DispBTNode(b->lchild);
            if(b->rchild!=NULL)
                printf(",");
            DispBTNode(b->rchild);
            printf(")");
        }
    }
}
void AllPath(BTNode *b){        //采用非递归方法输出从叶子结点到根结点的路径
    struct snode{
        BTNode *node;   //存放当前结点指针
        int parent;     //存放双亲结点在队列中的位置
    }Qu[MaxSize];   //定义顺序队列
    int front,rear,p;       //定义队头和队尾指针
    front=rear=-1;      //置队列为空队列
    rear++;
    Qu[rear].node=b;        //根结点指针进入队列
    Qu[rear].parent=-1;     //根结点没有双亲结点
    while(front<rear){      //队列不为空
        front++;
        b=Qu[front].node;       //队头出队列
        if(b->lchild==NULL && b->rchild==NULL){ //*b为叶子结点
            printf("%c到根结点路径:",b->data);
            p=front;
            while(Qu[p].parent!=-1){
                printf("%c ",Qu[p].node->data);
                p=Qu[p].parent;
            }
            printf("%c\n",Qu[p].node->data);
        }
        if(b->lchild!=NULL){    //左孩子入队列
            rear++;
            Qu[rear].node=b->lchild;
            Qu[rear].parent=front;
        }
        if(b->rchild!=NULL){    //右孩子入队列
            rear++;
            Qu[rear].node=b->rchild;
            Qu[rear].parent=front;
        }
    }
}
void AllPath1(BTNode *b,ElemType path[],int pathlen){   //采用递归方法输出从叶子结点到根结点的路径
    int i;
    if(b!=NULL){
        if(b->lchild==NULL && b->rchild==NULL){ //*b为叶子结点
            printf("%c到根结点路径:%c ",b->data,b->data);
            for(i=pathlen-1;i>=0;i--)
                printf("%c ",path[i]);
            printf("\n");
        }else{
            path[pathlen]=b->data;  //将当前结点放入路径中
            pathlen++;
            AllPath1(b->lchild,path,pathlen);   //递归扫描左子树
            AllPath1(b->rchild,path,pathlen);   //递归扫描右子树
            pathlen--;
        }
    }
}
void LongPath(BTNode *b,ElemType path[],int pathlen,ElemType longpath[],int &longpathlen){  //求最长路径
    int i;
    if(b==NULL){
        if(pathlen>longpathlen){    //若当前路径更长,将路径保存在longpath中
            for(i=pathlen-1;i>=0;i--)
                longpath[i]=path[i];
            longpathlen=pathlen;
        }
    }else{
        path[pathlen]=b->data;      //将当前结点放入路径中
        pathlen++;      //路径长度增1
        LongPath(b->lchild,path,pathlen,longpath,longpathlen);  //递归扫描左子树
        LongPath(b->rchild,path,pathlen,longpath,longpathlen);  //递归扫描右子树
        pathlen--;      //恢复环境
    }
}
void DispLeaf(BTNode *b){   //输出叶子结点
    if(b!=NULL){
        if(b->lchild==NULL && b->rchild==NULL)
            printf("%c ",b->data);
        else{
            DispLeaf(b->lchild);
            DispLeaf(b->rchild);
        }
    }
}
int main(){
    BTNode *b;
    ElemType path[MaxSize],longpath[MaxSize];
    int i,longpathlen=0;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
    printf("二叉树b:");DispBTNode(b);printf("\n\n");
    printf("b的叶子结点:");DispLeaf(b);printf("\n\n");
    printf("AllPath:\n");AllPath(b);printf("\n");
    printf("AllPath1:\n");AllPath1(b,path,0);printf("\n");
    LongPath(b,path,0,longpath,longpathlen);
    printf("第一条最长路径长度:%d\n",longpathlen);
    printf("第一条最长路径:");
    for(i=longpathlen;i>=0;i--)
        printf("%c ",longpath[i]);
    printf("\n");
    return 0;
}

本回答被网友采纳

求二叉树中从根结点到叶子节点的路径
printf("二叉树b:");DispBTNode(b);printf("\\n\\n");printf("b的叶子结点:");DispLeaf(b);printf("\\n\\n");printf("AllPath:\\n");AllPath(b);printf("\\n");printf("AllPath1:\\n");AllPath1(b,path,0);printf("\\n");LongPath(b,path,0,longpath,longpathlen);printf("第...

C语言 求二叉树根节点到叶子节点的路径
1,以一指针指向该叶子结点并向上(父结点)找,把父节点入栈(方便输出路径)2,把指针指向父节点,重复上面的过程,直到节点的父节点为空 3,依次出栈输出信息,路径就出来了 (注:此二叉树的节点应包括父指针,左右指针,数据域)就这么多吧! 要学习程序,就得自己尝试写,写多了就会了 还有...

怎样得到二叉树根节点到叶子节点的最远路径 算法
这就是一条根节点到最深层次叶子结点的路径。int getDeep(TreeNode *root){ if (root == NULL)return 0;int leftDeep = getDeep(root->left);int rightDeep = getDeep(root->right);return 1 + ((leftDeep >= rightDeep) ? leftDeep : rightDeep);} void getMaxPath(TreeNode *roo...

二叉树的深度
求二叉树深度的过程涉及从根节点到叶子节点的路径,这一路径上所有节点构成了树的一条路径,而最长路径的长度即为树的深度。在求解过程中,我们可以采用递归的方法来确定树的深度。具体来说,树的高度等于其左子树的高度和右子树的高度中的最大值再加上1。此外,对于判断二叉树是否为平衡二叉树的问题,...

请问完全二叉树中的度、深度、叶子数量怎么算?
深度:树中从根节点到最远叶子节点的最长路径上的节点数称为深度。在这棵树中,从根节点E到最远的叶子节点B的路径长度为3,所以这棵树的深度是3。根:这棵树的根节点是E。节点数量:这棵树一共有5个节点。叶子数量:叶子节点是指度为1的节点。在这棵树中,叶子节点有2个,分别是B和A。3-...

二叉树路径
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径 至少包含一个 节点,且不一定经过根节点。示例 1:示例 2:每走到一个结点,有三个选择:给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。...

二叉树深度的问题
一般而言,二叉树的深度被定义为从根节点到最远叶子节点路径上的节点总数。这种定义方式更为直观且实用,因为它强调了二叉树深度与树中节点分布的关系。在任何给定的二叉树中,从根节点到最深的叶子节点的路径长度,即为该树的深度。通过上述定义,我们可以清楚地理解二叉树深度的概念,并在实际应用中灵活...

二叉树叶子结点计算方法
从根节点1开始,它不是叶子节点,因此递归计算左子树和右子树的叶子节点数。左子树包含节点2、4和5。其中,4和5是叶子节点,所以左子树的叶子节点数为2。右子树包含节点3和6。其中,6是叶子节点,所以右子树的叶子节点数为1。最终,整个二叉树的叶子节点数为2(左子树)+ 1(右子树)= 3。使用...

离散数学题,谢谢帮忙
构建完成后,这棵二叉树的结构大致如下:42作为根节点,25为左子树的根节点,17为右子树的根节点,依次类推。具体连接方式需要自己连线。这棵最优二叉树的加权路径长度(WPL)计算如下:3*4 + 4*4 + 5*3 + 6*3 + 7*3 + 8*2 + 9*2 = 116。这个值代表了从根节点到所有叶子节点的路径...

树. 最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。叶子节点是指没有子节点的节点。在处理二叉树的最小深度问题时,可以采用多种方法。以下是四种解决方案:解法一:BFS.层序遍历 核心思想:使用队列进行层次遍历,记录每层节点数量,当遇到第一个叶子节点时,...

相似回答