C 建立二叉树的替代方法?

C 建立二叉树的替代方法?,c,binary-tree,C,Binary Tree,我试图找到建立二叉树的方法。几乎所有现有方法,如以下代码: BiTree CreateBiTree(){ char ch; BiTree T; scanf("%c",&ch); if(ch=='#')T=NULL; else{ T = (BiTree)malloc(sizeof(BiTNode)); T->data = ch; T->lchild = CreateBiTree();

我试图找到建立二叉树的方法。几乎所有现有方法,如以下代码:

BiTree CreateBiTree(){
    char ch;
    BiTree T;
    scanf("%c",&ch);
    if(ch=='#')T=NULL;
    else{
        T = (BiTree)malloc(sizeof(BiTNode));
        T->data = ch;
        T->lchild = CreateBiTree();
        T->rchild = CreateBiTree();
    }
    return T;
}
这种方法类似于预排序遍历,还有其他方法建立二叉树吗?

如下:

T = (BiTree)malloc(sizeof(BiTNode));
应该是

T = malloc(sizeof *T);
,并使用
sizeof

在C语言中,大写变量名非常罕见,而且非常容易混淆,在我看来,您不应该将指针星号去掉。

  • 我猜
    BiTree
    是一个隐藏在typedef后面的指针吗?这是非常糟糕的做法,因为它使代码无法读取。将
    BiTree
    typedef更改为普通
    typedef结构
  • 避免在递归函数内部使用scanf()或任何其他复杂函数,没有它,递归速度足够慢。(递归函数通常是不好的,因为它们效率低下且难以读取,二叉树大概是它们唯一的有效用途。)
  • 不要强制转换malloc的返回值

至于算法本身,您可以通过在每个节点中使用“previous”指针,在树中指向上(类似于双链接列表),创建一个无递归的二叉树。这样的实现会消耗更多的数据内存,因为每个节点都必须存储额外的指针,但堆栈内存要少得多。消除了递归带来的堆栈溢出问题。它们执行得更快,因为递归函数调用开销被删除。

(BiTree)malloc(sizeof(BiTNode))
看起来不可靠标题很奇怪,但我不知道如何修复它(也就是说,我不知道写什么)。@unwind:我已经编辑了它-我认为这是预期的意思,但我不确定!我猜这段代码看起来很可疑,因为
BiTree
是一个typedef:ed指针,这是一种非常糟糕的做法,因为它使代码无法读取。