1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define MAX_SIZE 1024
    4. #define NAME_SIZE 255
    5. //数据元素
    6. typedef struct{
    7. int id;
    8. char name[NAME_SIZE];
    9. }ElementType;
    #include "ElementType.h"
    
    //树结点
    typedef struct treeNode{
        ElementType data;//树结点的数据域
        struct treeNode *left;//左子树
        struct treeNode *right;//右子树
    }TreeNode;
    
    #include "TreeNode.h"
    
    //二叉链表
    typedef struct{
    TreeNode *root;//二叉树的根结点
    int length;//结点总数
    int depth;//二叉链表深度
    int diameter;//直径-从叶结点到叶结点的最长路径
    }BinaryTree;
    
    //初始化空二叉树
    void InitBinaryTree(BinaryTree * tree);
    
    //创建二叉树,外部需要事先对结点分配内存
    //返回值为0时表示不创建(创建失败)
    int CreateBinaryTree(TreeNode *root);
    
    //前序遍历,也叫先根遍历、先序遍历、前序周游,可以记作:根-左-右
    void PreOrderTraverse(TreeNode *node);
    
    #include "BinaryTree.h"
    #include <iostream>
    
    //用来实现结点id的自增长
    static int id=0;
    
    //初始化空二叉树
    void InitBinaryTree(BinaryTree * tree){
    tree->root=NULL;
    tree->depth=0;
    tree->diameter=0;
    tree->length=0;
    }
    
    
    //创建二叉树,外部需要事先对结点分配内存
    int CreateBinaryTree(TreeNode *root){
        //根结点如果为空,就退出创建过程
        if(!root) return 0;
        char inputName[NAME_SIZE];//用户输入的结点名
        gets_s(inputName);
        //用户输入回车表示结束当前子树的创建
        if(strcmp(inputName,"\0")==0) return 0;
        //创建当前结点
        root->data.id=++id;
        strcpy(root->data.name,inputName);
    
        //为输入左右结点做准备,为左右结点指针分配内存
        root->left=(TreeNode *)malloc(sizeof(TreeNode));
        root->right=(TreeNode *)malloc(sizeof(TreeNode));
        //分别递归创造左子树和右子树
        printf("左结点:");
        if(CreateBinaryTree(root->left)==0){
        //不再创建这个结点则销毁结点刚分配的内存
            free(root->left);
            root->left=NULL;
        }
        printf("右结点:");
        if(CreateBinaryTree(root->right)==0){
        //不再创建这个结点则销毁结点刚分配的内存
            free(root->right);
            root->right=NULL;
        }
    
    }
    
    //前序遍历
    void PreOrderTraverse(TreeNode *node){
        //先访问根结点,然后遍历左子树,最后遍历右子树
        if(node){
            printf("[%d,%s]-",node->data.id,node->data.name);
            PreOrderTraverse(node->left);
            PreOrderTraverse(node->right);
        }
    }
    
    #include <iostream>
    using namespace std;
    #include "BinaryTree.h"
    
    void TestBinaryTree();
    
    int main(){
        TestBinaryTree();
    
        return 0;
    
    }
    
    void TestBinaryTree(){
    BinaryTree tree;
    InitBinaryTree(&tree);
    //容易遗漏的点:根结点需要事先分配内存
    tree.root=(TreeNode *)malloc(sizeof(TreeNode));
    cout<<"请输入根结点"<<endl;
    CreateBinaryTree(tree.root);
    
    printf("\n\n前序遍历结果:\n");
    PreOrderTraverse(tree.root);
    
    free(tree.root);
    }