树
看了一下大话数据结构的树源码对应基础差的东西还是不太友好,这边写了一篇简单的。(个人观点)
例如:上面这一棵树写个简单关于树的代码实际树的运用还是围绕二叉树和红黑树展开:
#include "pch.h"
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node*lchild;//左链域
struct node*rchild;//右链域
};
typedef node BiTNode;
typedef node* BiTree;
typedef char chType;
//初始化根节点
BiTree Init_Tree(BiTNode*root)
{
BiTree tree = root;
return tree;
}
//创建节点
BiTNode*MakeNode(chType data, BiTNode*lchild, BiTNode*rchild)
{
BiTNode*temp = (BiTNode*)malloc(sizeof(BiTNode));
if (temp == NULL)
{
return NULL;
}
temp->data = data;
temp->lchild = lchild;
temp->rchild = rchild;
return temp;
}
//释放节点
void Free_Node(BiTNode*pnode)
{
if (pnode != NULL)
{
free(pnode);
pnode = NULL;
}
}
//销毁树
void Destroy_Free(BiTree tree)
{
BiTNode*temp = tree;
//左孩子不为空 递归释放
if (temp->lchild != NULL)
{
Destroy_Free(temp->lchild);
}
if (temp->rchild != NULL)
{
Destroy_Free(temp->rchild);
}
Free_Node(temp);
}
//判断树是否为空
int Empty_Free(BiTree tree)
{
if (tree == NULL)
{
return 0;
}
else
{
return 1;
}
}
//2
//求树的深度
int GetDepth(BiTree tree)
{
int left;
int right;
if (tree == NULL)
{
return 0;
}
left = GetDepth(tree->lchild);
right = GetDepth(tree->rchild);
return left > right ? (left + 1) : (right + 1);
}
//获取的树的根节点
BiTree Get_Free(BiTree tree)
{
return tree;
}
//获取的树的节点
int Get_Node(BiTNode*node)
{
return node->data;
}
//设置的树的节点
void Set_Node(BiTNode*node, chType data)
{
node->data = data;
}
//设置的树的左孩子
BiTNode* Set_lchild(BiTNode*node, BiTNode*lchild)
{
node->lchild = lchild;
return lchild;
}
//获取的树的左孩子
BiTNode* Get_lchild(BiTNode*tree)
{
if (tree == NULL)
{
return NULL;
}
return tree->lchild;
}
//设置的树的右孩子
BiTNode* Set_rchild(BiTNode*node, BiTNode*rchild)
{
node->rchild = rchild;
return rchild;
}
//获取的树的右孩子
BiTNode* Get_rchild(BiTNode*tree)
{
if (tree == NULL)
{
return NULL;
}
return tree->rchild;
}
//插入子树
BiTree Insert_Child(BiTNode*parent, int lr, BiTNode*child)
{
if (parent)
{
if (parent->lchild == NULL && lr == 0)
{
parent->lchild = child;
return child;
}
if (parent->rchild == NULL && lr == 1)
{
parent->rchild = child;
return child;
}
}
return NULL;
}
//删除子树
void DeleteChild(BiTNode*parent, int lr)
{
if (parent)
{
if (parent->lchild != NULL && lr == 0)
{
parent->lchild = NULL;
Free_Node(parent->lchild);
}
if (parent->rchild != NULL && lr == 1)
{
parent->rchild = NULL;
Free_Node(parent->rchild);
}
}
}
//中序遍历
void Middle_Print(BiTNode*head)
{
if (head != NULL)
{
Middle_Print(head->lchild);
printf("%c\n", head->data);
Middle_Print(head->rchild);
}
}
int main()
{
BiTNode* node1 = MakeNode('D', NULL, NULL);
BiTNode* node2 = MakeNode('B', node1, NULL);
BiTNode* node3 = MakeNode('E', NULL, NULL);
BiTNode* node4 = MakeNode('F', NULL, NULL);
BiTNode* node5 = MakeNode('C', node3, node4);
BiTNode* node6 = MakeNode('A', node2, node5);
Middle_Print(node6);
system("pause");
return 0;
}