创建二叉树,C语言实现

一、前序遍历创建二叉树,使用递归,头文件 BiTree.h

/*槽点一:创建树时用scanf输入不成功*/

#ifndef BITREE_H
#define BITREE_H

#include<stdio.h>
#include<stdlib.h>

typedef char ElementType;
typedef struct treenode
{
    ElementType data;
    struct treenode *leftchild;
    struct treenode *rightchild;
} TreeNode;

/*使用先序遍历创建二叉树*/
TreeNode *create_bitree()
{
    ElementType ch;
    TreeNode *T;

    scanf("%c",&ch);    //这样调用scanf时,树的结点一次全部输入,如果要一次一个的输入,在%c前加个空格
    if(ch!='#')
    {
        T=(TreeNode*)malloc(sizeof(TreeNode));
        T->data=ch;
        T->leftchild=create_bitree();
        T->rightchild=create_bitree();
    }
    else
    {
        T=NULL;
    }
    return T;
}

/*先序遍历*/
void pre_order_traversal(TreeNode *T)
{
    ElementType data;
    if(T!=NULL)
    {
        data=T->data;
        printf("%c ",data);
        pre_order_traversal(T->leftchild);
        pre_order_traversal(T->rightchild);
    }
}

#endif

有两个地方需要注意:1、要将树的节点指针作为返回值返回,而不能向下面这样直接作为参数传入,因为作为参数传递时只是传递了T 的一个copy,后来调用malloc函数分配新的内存地址时,也是赋给了这个备份,也就是说最后T依然没有改变,碰到malloc和指针做参数都要注意这个问题;2、scanf函数的问题:scanf会读入回车符,当需要一个一个的输入字符时,可以在%c前面加个空格

int create_bitree(TreeNode *T;)
{
    ElementType ch;

    scanf("%c",&ch);    //这样调用scanf时,树的结点一次全部输入,如果要一次一个的输入,在%c前加个空格
    if(ch!='#')
    {
        T=(TreeNode*)malloc(sizeof(TreeNode));
        T->data=ch;
        create_bitree(T->leftchild);
        create_bitree(T->rightchild);
    }
    else
    {
        T=NULL;
    }
    return 1;
}
原文地址:https://www.cnblogs.com/xmkk/p/3301182.html