【问题标题】:Drawing a binary tree to console in c在c中绘制二叉树到控制台
【发布时间】:2016-07-22 01:54:26
【问题描述】:

我想说明我在提问之前已经看过这篇文章:C How to "draw" a Binary Tree to the console

假设我有以下树。如果我的打印函数只打印数字(按顺序遍历),我会打印出以下内容:1,3,4,6,7,8,10,13,14。

考虑到树是按该顺序打印的,绘制如下图的树的最佳方法是什么?

我觉得如果先打印 8,然后再打印 3,10 等等。这会更容易,但由于它是按顺序遍历,所以首先打印 1,这将是顶部的第一个打印语句。

【问题讨论】:

  • 按顺序遍历(上面一行列出)
  • 对,所以你想知道如何按顺序遍历树。尝试搜索“按顺序遍历的二叉树”。 SO 内部和外部都有很多现有指南。

标签: c tree binary-tree tree-traversal inorder


【解决方案1】:

我大约在 2 年前完成了一些课程作业...

我创建了一个节点结构,其中包含自己的数据和 2 个节点,一个左一个右,它看起来像这样(我找不到最终代码,可能使用了共享指针):

struct node
{
    int data;
    node *left;
    node *right;
};

然后我通过使用递归向其添加更多节点来创建我的树,如下所示:

void insert(node **tree, int value)
{
    if (*tree == nullptr)
    {
        *tree = new node;
        (*tree)->data = value;
        (*tree)->left = nullptr;
        (*tree)->right = nullptr;
    }
    else if (value < (*tree)->data)
    {
        insert(&((*tree)->left), value);//memory location of the pointer to the node of the node
    }
    else if (value > (*tree)->data)
    {
        insert(&((*tree)->right), value);
    }
    else
        return;
}

旁注:回首往事,如果可能的话,我从未考虑过添加与现有节点具有相同值的节点。

我假设你会做类似的事情。现在来回答你的问题,打印出来,也使用递归。

void inorder(node *tree)
{
    if (!(tree == nullptr))
    {
        inorder((tree)->left);
        cout << (tree->data) << endl;//Prints on new lines, you could comma separate them if you really wanted.
        inorder((tree)->right);
    }
}

最后,您需要在使用完树后清理它,因此您需要将其删除...递归

说实话已经有一段时间了,这个递归的东西对我来说仍然有点困惑,所以我可能忘记了一些东西,但理论就在那里!

编辑,使用的标题:&lt;iostream&gt;&lt;memory&gt;,这也是 c++ 而不是 c,但它们非常相似。

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2016-02-24
    • 2014-12-23
    • 2012-11-22
    相关资源
    最近更新 更多