标题:如何显示二叉树
只看楼主
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
结帖率:100%
已结贴  问题点数:100 回复次数:8 
如何显示二叉树
最近想练习下二叉树的代码,发现大部分练习都是在纸上画个二叉树,然后再写什么先序、中序、后序,最后将运行结果对比纸上的二叉树检验,可你怎么知道你创建的二叉树就是正确的呢?因此就费了点功夫写了个二叉树显示代码,虽然能完成显示功能,但我觉得算法稍嫌啰嗦,应该有更简洁的写法,特提出供各位集思广益,我的不含二叉树显示的练习代码如下(同时提供一个4层满树和一个6层随机树显示效果):

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char cnum;
typedef struct node
{
    char c;
    node *lc,*rc;
}tree,*list;

list creat(list root,int lv)
{
    if(lv<2||(rand()%6<6&&lv<4))    //创建4层满树
    //if(lv<2||(rand()%6<4&&lv<6))    //创建6层随机树
    {
        root=(list)malloc(sizeof(tree));
        root->lc=root->rc=NULL;
        root->c=cnum++;
    }
    else return NULL;
    root->lc=creat(root->lc,lv+1);
    root->rc=creat(root->rc,lv+1);
    return root;
}
void listtree(list root)
{//显示树
//各位高手可在此大显神通,填充可显示二叉树的代码
}
void main()
{
    list root=NULL;
    srand((unsigned int)time(NULL));
    cnum='A';
    root=creat(root,0);
    listtree(root);
}
搜索更多相关主题的帖子: 显示 二叉树 代码 list NULL 
2017-10-21 04:31
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
关注下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-21 10:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
这个要花一点时间思考~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-21 10:50
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
先从实用性讨论来说这个是有屏幕宽度限制的~所以感觉顶点的居中显示比较简单~之后……想到再更吧~代码还是不要抱有期望了,毕竟最近敲个代码像抽血一样~有时一弄就是几个小时甚至几天时间~我嘛~顶多说说思路,当然还是看看有没有其他大神出手咯~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-21 11:33
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
更~普通做法实质就是按层遍历~(当然用API函数修改输出坐标另计)~其实思路并不难想到~关键是细节理解实现方面和效率问题~例如怎么知道树的位置怎么获取输出坐标这些是要慢慢琢磨的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-21 11:39
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
工作太忙已经放下代码好长一段时间了。

画树程序最简单的其实就是层次遍历。
但是这样写代码会相当长,当然如果已经有以前写的队列函数就会简单不少。

首先测试树的高度,以此来让画树函数产生足够量的空格。
然后层次遍历,将该节点传递给画树函数,如果节点为NULL,则画一个站位标记,否则输出值。

差不多就是这样,细节问题没有考虑,太久不写代码,连思路什么的都没了。



[此贴子已经被作者于2017-10-21 21:50编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-10-21 21:14
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:100 
横着太麻烦,竖着简单

程序代码:
void bt_print(b_tree_t *bt, int depth, bool *flags) {
    for (int i = 0; i < depth - 1; i++) {
        printf(" %s ", flags[i] ? "" : " ");
    }
    if (depth) printf(" %s─", flags[depth - 1] ? "" : "");
    if (NULL == bt) {
        printf("INF\n");
        return;
    }

    printf("%d\n", bt->data);
#if 1
    if (NULL == bt->lchild && NULL == bt->rchild)
        return;
#endif

    flags[depth] = true;
    bt_print(bt->lchild, depth + 1, flags);
    flags[depth] = false;
    bt_print(bt->rchild, depth + 1, flags);
}
bool flags[bt_depth(bt)];
bt_print(bt, 0, flags);


[fly]存在即是合理[/fly]
2017-10-24 17:13
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
回复 7楼 azzbcc
厉害……或许就连x版也会忍不住赞叹吧看来竖着看就变成中序遍历了~而且深度和空格的关系容易联立很多到底还是学习了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-24 18:13
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:0 
回复 7楼 azzbcc

后面有空再发自己在二叉树方面代码。
2017-10-24 20:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-481617-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.068991 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved