关于树的基础操作
树的基本操作 |
|
注意: |
本文涉及大量的二级指针,如果有不熟悉的地方,希望读者能够查阅相关资料。 |
/* 文件名称: 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