首先是树结点的结构
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一下,看看哪一步运行到哪里,返回的时候返回的是哪里。
一个很简单的建树过程。我也花了很长时间才弄明白。纸上谈兵很容易,不如自己亲手敲一下。