二叉树的建立(C语言)

首先是树结点的结构

struct TreeNode
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};
typedef struct TreeNode TNode;
typedef struct TreeNode *T_Pointer;

这没什么说的。

建树的代码:

void Build_Tree(T_Pointer &T)
{
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
    {
        T=NULL;
    }
    else
    {
        T=(T_Pointer)malloc(sizeof(TNode));
        T->val=ch;
        Build_Tree(T->left);
        Build_Tree(T->right);
    }
}

输出树

T_Pointer Printf_Tree(T_Pointer &T)
{
    if(T!=NULL)
    {
        printf("%c",T->val);
        Printf_Tree(T->left);
        Printf_Tree(T->right);
    }
}
int main()
{
    T_Pointer root;
    root=NULL;
    Build_Tree(root);
    Printf_Tree(root);
    return 0;
}

这里建树的方式是先序。
在这里插入图片描述
在这里插入图片描述
输入的时候要注意。要一次性输入“AB##C##”。不能输入一个‘A’然后就按回车。这样的话,下一次读取的字符就是换行符’\n’。

Build_Tree(T_Pointer &T)中,我用的引用传递参数。如果你要用指针传递参数的话,就得传递一个二级指针T_Pointer *T。

scanf("%c",&ch);也可以用ch=getchar();代替。

T=(T_Pointer)malloc(sizeof(TNode));注意这里不能用T_Pointer T=(T_Pointer)malloc(sizeof(TNode));如果用后者,返回主函数的时候,主函数中声明的root仍是NULL。因为用后者的话,就是说你新建了一个T,但这个T不是root。如果已经申请了一个T,赋好值,进入到Build_Tree(T->left)和Build_Tree(T->right)。那么进入函数之后,T->left就成为新的T。

我debug了一个,T->left和T->right在没有动态申请内存的时候:
在这里插入图片描述

0xBAADF00D : Used by Microsoft’s LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory

一般的HeapAlloc和LocalAlloc分配内存的初值都是这个,最常见为使用未初始化的指针导致0xC0000005访问0xBAADFOOD出错.

参考:
https://www.cnblogs.com/cswuyg/archive/2012/07/07/2580824.html
https://blog.csdn.net/vonger/article/details/4644868?utm_source=blogxgwz7

我觉得递归的过程,还是要自己debug一下,看看哪一步运行到哪里,返回的时候返回的是哪里。

一个很简单的建树过程。我也花了很长时间才弄明白。纸上谈兵很容易,不如自己亲手敲一下。

  • 13
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值