问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-28 10:32

我来回答

2个回答

热心网友 时间:2022-04-15 05:38

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 (称为后根次序遍历)。

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

热心网友 时间:2022-04-15 06:56

#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;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
有释放证明书可以开无犯罪证明吗 刑满释放人员入党需要公安机关出具怎样证明与无罪证明一样的作用 交通事故私了是要注意哪些问题 【私了注意事项】车祸哪些情况不能私了 交通事故私了要注意什么 私了交通事故要注意的问题 wifi6跟wifi5的区别有什么? 只有吉祥寺是想住的街道吗 演员表 《吉祥寺真的是你想住的街道吗》:每个人都会找到适合自己的街道 日剧《只有吉祥寺是想住的街道吗》为何选择“生きていたん 如何评价日剧《只有吉祥寺是想住的街道吗?》? 关于昆虫记得读后感 二叉树的高度是多少? 求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值 关于昆虫记的手抄报的版面 如何解决哈夫曼树不唯一的问题? 求二叉树的带权路径长度? 科学书读后感小报 读《昆虫记》感悟!手抄报用100字以上150字以下! 芋头荷有什么功效 更换手机号码后如何登陆原来的QQ号码 换了个手机号怎么找回原来的QQ密码呢? 换了个手机要想登陆那个qq号以前的密码忘了怎么办 我换手机了,忘记了以前QQ的密码,在新手机上我想上QQ,该怎么操作 QQ密码忘了,原来的手机号不用了,用新手机号怎么找回原来密码再登原来的账号? 我win7系统设置了开机密码,为什么密码一直显示输入错误? win7开机提示用户名和密码错误 清华同方win7系统开机密码不正确怎么办? win7设置了登陆密码,开机输入密码后提示用户名或密码不正确,可密码明明是正确的 怎么回事 win7旗舰版开机密码总是不正确!在线等。 win7开机登录时,输入密码错误。。。 昆虫记感想 哈夫曼树的定义是:带权路径长度最小的二叉树。 我先请问:为何它是带全路径长度最小的二叉树??最小是 实在急!谁能写一写关于昆虫记的读后感啊!500字 求助,想知道求一颗二叉树所有直径及路径长度怎么做,中根和后根次序... 做一份读书笔记的小报,其中还要包含《童年》和《昆虫记》的读书笔记 霍夫曼算法求扩充二叉树的带权外部路径长度 求制作一份与《童年》《昆虫记》《汤姆索亚历险记》有关内容的电脑报(不要PPT,想手抄报那样的,只不过是 什么样的二叉树的路径长度PL最小 具有n个结点,其路径长度最短的二叉树是 有一带权二叉树,求此树的带权路径长度。 中国的第一部手机是什么? 什么叫化纤衣服 化纤类衣服到底指的是什么?化纤指的是什么? 衣服常见的几种化纤面料那种最好,不要COPY别处 网上买衣服见很多面料都是人造纤维&#47;化纤的,对这个不懂,请教一下. 跪求各种做衣服的化纤的种类。。 支付宝收款码可以发给别人吗 为什么优衣库用化纤做衣服,还有那么多人抢着买? 喜欢一件纱的衣服。有两家一个是聚酯纤维,一个是化纤的。请问聚酯纤维和化纤的区别?哪个柔软点。 小天才电话手表支付宝收款码怎么发给好友