鱼C论坛

 找回密码
 立即注册
查看: 3579|回复: 9

[已解决]二叉树转化为森林 父子关系的递归遍历

[复制链接]
发表于 2018-6-25 17:52:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Martine 于 2018-6-25 18:08 编辑

题:将如图所示的深林转化为二叉树(易)
pic2.png pic1.png
将父子关系表示为 父(子,子......)
则该森林的数据结构可以表示为 A(B(EF)C(G)D)
#include <stdio.h>
#include <stdlib.h>

typedef char ElemType;

typedef struct node
{
        ElemType data;
        struct node *lchild, *rchild;
}node, *btree;

void CreateBtree(btree *root)
{        
        ElemType c;
        scanf("%c", &c);
        if('#' == c){
                *root = NULL;
        }else{
                *root = (btree)malloc(sizeof(node));
                (*root)->data = c;

                CreateBtree(&(*root)->lchild);
                CreateBtree(&(*root)->rchild);
        }
}

void in(btree root)
{
        if(root)
        {
                in(root->lchild);
                printf("[%c ] ", root->data);
                in(root->rchild);
        }
}


void herit(btree root)
{
        printf("%c", root->data);
        if(root->lchild || root->rchild){
                printf("(");
                if(root->lchild)
                        herit(root->lchild);
                if(root->rchild)
                        herit(root->rchild);
                printf(")");
        }
}


int main(void)
{
        btree root;
        CreateBtree(&root);
        in(root);
        putchar('\n');

        herit(root);
        putchar('\n');
        printf(" \n######Wors*/k done!#######\n");

        return 0;
}
output.png

如何增加边界检测才能去掉多余的括号 ?求解!!
最佳答案
2018-6-25 20:15:19
Martine 发表于 2018-6-25 19:17
错了, 答案是A(B(EF)C(G)D) 不是A(B(E(F)C(GD)));
D的父节点是A 不是C

1.png
貌似是对了?
我也不确定,这个结果是调试出来的,再换几组数据测试一下
#include <stdio.h>
#include <stdlib.h>

typedef char ElemType;

typedef struct node
{
        ElemType data;
        struct node *lchild, *rchild;
}node, *btree;


char data[] = "ABE#F##CG##D###";
char *p = data;
void CreateBtree(btree *root)
{
        ElemType c;
        //scanf("%c", &c);
        c = *p++;                // 为 debug 方便

        if('#' == c){
                *root = NULL;
        }
        else{
                *root = (btree)malloc(sizeof(node));
                (*root)->data = c;

                CreateBtree(&(*root)->lchild);
                CreateBtree(&(*root)->rchild);
        }
}

void in(btree root)
{
        if(root)
        {
                in(root->lchild);
                printf("[%c ] ", root->data);
                in(root->rchild);
        }
}


void herit(btree root)
{
        printf("%c", root->data);
        if(root->lchild || root->rchild){
                if(root->lchild)
                        printf("(");

                if(root->lchild)
                        herit(root->lchild);
                if(root->rchild)
                        herit(root->rchild);
                
                //if(root->rchild)
                //        printf(")");
        }
        else
                printf(")");
}


int main(void)
{
        btree root;
        CreateBtree(&root);
        in(root);
        putchar('\n');

        herit(root);
        putchar('\n');
        printf(" \n######Wors*/k done!#######\n");

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-25 18:02:15 | 显示全部楼层
如果可以,把代码发完整,我研究研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 18:10:45 | 显示全部楼层
人造人 发表于 2018-6-25 18:02
如果可以,把代码发完整,我研究研究

测试数据 ABE#F##CG##D###
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 18:38:23 | 显示全部楼层
1.png

图片不对吧?

也就是说要输入 ABE#F##CG##D### ,输出 A(B(EF)C(G)D) 就行了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 18:51:05 | 显示全部楼层
人造人 发表于 2018-6-25 18:38
图片不对吧?

也就是说要输入 ABE#F##CG##D### ,输出 A(B(EF)C(G)D) 就行了?

是!
要的就是你那种结果
你是怎么做到的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 19:01:31 | 显示全部楼层
Martine 发表于 2018-6-25 18:51
是!
要的就是你那种结果
你是怎么做到的?

我复制了你的代码,就是那个截图
不是输入 ABE#F##CG##D###,输出 A(B(EF)C(G)D) 吗?
现在是输入 ABE#F##CG##D###,输出 A(B(E(F)C(GD)))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-25 19:17:44 | 显示全部楼层
人造人 发表于 2018-6-25 19:01
我复制了你的代码,就是那个截图
不是输入 ABE#F##CG##D###,输出 A(B(EF)C(G)D) 吗?
现在是输入 ABE# ...

错了, 答案是A(B(EF)C(G)D) 不是A(B(E(F)C(GD)));
D的父节点是A 不是C
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-25 20:15:19 | 显示全部楼层    本楼为最佳答案   
Martine 发表于 2018-6-25 19:17
错了, 答案是A(B(EF)C(G)D) 不是A(B(E(F)C(GD)));
D的父节点是A 不是C

1.png
貌似是对了?
我也不确定,这个结果是调试出来的,再换几组数据测试一下
#include <stdio.h>
#include <stdlib.h>

typedef char ElemType;

typedef struct node
{
        ElemType data;
        struct node *lchild, *rchild;
}node, *btree;


char data[] = "ABE#F##CG##D###";
char *p = data;
void CreateBtree(btree *root)
{
        ElemType c;
        //scanf("%c", &c);
        c = *p++;                // 为 debug 方便

        if('#' == c){
                *root = NULL;
        }
        else{
                *root = (btree)malloc(sizeof(node));
                (*root)->data = c;

                CreateBtree(&(*root)->lchild);
                CreateBtree(&(*root)->rchild);
        }
}

void in(btree root)
{
        if(root)
        {
                in(root->lchild);
                printf("[%c ] ", root->data);
                in(root->rchild);
        }
}


void herit(btree root)
{
        printf("%c", root->data);
        if(root->lchild || root->rchild){
                if(root->lchild)
                        printf("(");

                if(root->lchild)
                        herit(root->lchild);
                if(root->rchild)
                        herit(root->rchild);
                
                //if(root->rchild)
                //        printf(")");
        }
        else
                printf(")");
}


int main(void)
{
        btree root;
        CreateBtree(&root);
        in(root);
        putchar('\n');

        herit(root);
        putchar('\n');
        printf(" \n######Wors*/k done!#######\n");

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-6-26 09:12:33 | 显示全部楼层
人造人 发表于 2018-6-25 20:15
貌似是对了?
我也不确定,这个结果是调试出来的,再换几组数据测试一下

感谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-26 09:13:03 | 显示全部楼层
人造人 发表于 2018-6-25 20:15
貌似是对了?
我也不确定,这个结果是调试出来的,再换几组数据测试一下

感谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表