关于树的基础操作

树的基本操作

注意:

本文涉及大量的二级指针,如果有不熟悉的地方,希望读者能够查阅相关资料。

 

/*
    文件名称: tree.h
    作用描述: 
        理解树(结构题的基本操作)
*/
# ifndef __TREE_H__
# define __TREE_H__

typedef int treeNodeData;

struct binaryTreeNode
{
    treeNodeData data;                 // 数据
    struct binaryTreeNode * lchild;    // 左孩子
    struct binaryTreeNode * rchild;    // 右孩子
};

typedef struct binaryTreeNode     treeNode;    // 方便使用

/*
    函数名称: initializeTree
    函数传参: 二级指针
    函数返回: void
    函数功能: 对外部定义的树的跟节点进行初始化
    函数描述: 根据值初始化,方便后续生成红黑树,或者平衡二叉树
*/
void initialBinaryTree(treeNode ** root);

/*
    函数名称: destoryBinaryTree
    函数传参: 二级指针
    函数返回: void
    函数功能: 销毁二叉树
    函数描述: 
*/
void destoryBinaryTree(treeNode ** root);

/*
    函数名称: preTravelTree
    函数传参: 二级指针
    函数返回: void
    函数功能: 先序遍历整棵树
    函数描述: 
*/
void preTravelTree(treeNode ** root);

/*
    函数名称: inTravelTree
    函数传参: 二级指针
    函数返回: void
    函数功能: 中序遍历整棵树
    函数描述: 
*/
void inTravelTree(treeNode ** root);

/*
    函数名称: postTravelTree
    函数传参: 二级指针
    函数返回: void
    函数功能: 后序遍历整棵树
    函数描述: 
*/
void postTravelTree(treeNode ** root);


/*
    函数名称: insertTreeNode
    函数传参: 根节点二级指针
    函数返回: void
    函数功能: 插入排序二叉树节点
    函数描述:
        所有小于中间节点的字节点都在左边
        所有大于中间节点的子节点都在右边
        没有等于中间节点的子节点
*/
void insertTreeNode(treeNode ** root, int val);

# endif
/*
    文件名称: tree.c
    作用描述:
        基本函数的实现
        理解树(结构题的基本操作)
*/

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

void initialBinaryTree(treeNode ** root)
{
    // 入参检测
    if (root == NULL)
    {
        return;
    }

    *root = NULL;
}


void destoryBinaryTree(treeNode ** root)
{
    if (root == NULL)
    {
        return;
    }
    
    if (*root == NULL)
    {
        return;
    }
    destoryBinaryTree(&((*root)->lchild));
    destoryBinaryTree(&((*root)->rchild));
    
    (*root)->lchild = NULL;
    (*root)->rchild = NULL;
    
    free(*root);
    *root = NULL;
}


void preTravelTree(treeNode ** root)
{
    if (root == NULL)
    {
        return;
    }
    if (*root == NULL)
    {
        return;
    }
    
    printf("%d ", (*root)->data);
    preTravelTree(&((*root)->lchild));
    preTravelTree(&((*root)->rchild));
}

void inTravelTree(treeNode ** root)
{
    if (root == NULL)
    {
        return;
    }
    if (*root == NULL)
    {
        return;
    }
    
    inTravelTree(&((*root)->lchild));
    printf("%d ", (*root)->data);
    inTravelTree(&((*root)->rchild));
}


void postTravelTree(treeNode ** root)
{
    if (root == NULL)
    {
        return;
    }
    if (*root == NULL)
    {
        return;
    }
    
    postTravelTree(&((*root)->lchild));
    postTravelTree(&((*root)->rchild));
    printf("%d ", (*root)->data);
}


static void insertTreeNodePnode(treeNode ** root, treeNode * node)
{
    if (*root == NULL)
    {
        *root = node; /* 注意 */ 
        return;
    }
    if (node == NULL)
    {
        return;
    }
    
    if ((*root)->data > node->data)
    {
        insertTreeNodePnode(&((*root)->lchild), node);
    }
    else if ((*root)->data < node->data)
    {
        insertTreeNodePnode(&((*root)->rchild), node);
    }
    else
    {
        return;
    }
}

void insertTreeNode(treeNode ** root, int val)
{
    // 将val值创建成节点
    treeNode * node = NULL;
    if (root == NULL)
    {
        return;
    }
    
    node = (treeNode *)malloc(sizeof(treeNode));
    if (node == NULL)
    {
        return;
    }
    node->data = val;
    node->rchild = NULL;
    node->lchild = NULL;
    
    insertTreeNodePnode(root, node);
}

测试函数main函数

/*
    文件名称: mian.c
    作用描述:
        对树进行测试
*/

# include "tree.h"
# include <stdio.h>


int main(void)
{
    // pTreeNode p;
    treeNode * root = NULL;
    
    initialBinaryTree(&root);
    
    insertTreeNode(&root, 10);
    insertTreeNode(&root, 9);
    insertTreeNode(&root, 12);
    
    insertTreeNode(&root, 123);
    insertTreeNode(&root, 111);
    insertTreeNode(&root, 110);
    
    preTravelTree(&root);
    printf("\n");
    
    destoryBinaryTree(&root);
        
    return 0;
}

编译过程 makefile文件

src=*.c
tree:$(src)
    gcc $(src) -o tree -Wall
    
.PHONY:
clean:
    rm tree

运行过程:

  将main.c tree.c tree.h 放在同一目录下

  新建makefile文件,将填写如上内容

  执行make

  运行./tree

 

posted @ 2015-08-17 14:31  自由故  阅读(172)  评论(0编辑  收藏  举报