本文给出了树相关算法,包括树的建立,树的遍历:先序遍历、中序遍历、后序遍历、层次遍历,以及遍历算法的应用。此外还有判断某棵二叉树是否为完全二叉树的算法。更多详细代码可见本人GitHub:DS
#include <cstddef>
#include <stdio.h>
#include <malloc.h>
typedef int Datatype; //定义数据格式
#define MAX_TREE_SIZE 100
//树的存储结构
//二叉链表
typedef struct BiTreeNode
{
Datatype data; //数据
struct BiTreeNode* lchild; //左孩子
struct BiTreeNode* rchild; //右孩子
}BiTreeNode,*BiTree;
//三叉链表
typedef struct TriTreeNode
{
Datatype data;
struct TriTreeNode* lchild, * rchild, * parent; //左孩子,右孩子,双亲
}TriTreeNode,*TriTree;
/*存储结构*/
//树的双亲表示法
typedef struct PTNode
{
Datatype data;
int parent;
}PTNode;
typedef struct PTree
{
PTNode nodes[MAX_TREE_SIZE];
int r, n;
}PTree;
//树的孩子表示法
typedef struct CTNode
{
int child;
struct CTNode* next;
}CTBox;
typedef struct CTree
{
CTBox nodes[MAX_TREE_SIZE];
int n, r;
}CTree;
//树的双亲孩子表示法
//树的孩子兄弟表示法
typedef struct CSNode
{
Datatype data;
struct CSNode* firstchild, * nextsibling; //第一个孩子结点和下一个兄弟结点
}CSNode;
树的遍历算法:
/*树的遍历:前序、中序、后序*/
void visit(Datatype data)
{
printf("%d ", data);
}
//前序遍历
void PreOrder(BiTree bt)
{
if (bt != NULL)
{
visit(bt->data); 访问函数依据实际情况填入
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
//中序遍历
void InOrder(BiTree bt)
{
if (bt