二叉树
typedef struct TreeNode *BinTree;
struct TreeNode
{
int Data;
BinTree Left;
BinTree Right;
};
int treeDepth(BinTree T)
{
it(T == NULL) return 0;
else
{
int l = treeDepth(T->Left);
int r = treeDepth(T->Right);
return l > r l + 1 : r + 1;
}
}
void PreOrderTraversal(BinTree BT)
{
BinTree T = BT;
Stack S = CreateStack();
wihle(T || !isEmpty(S))
{
while (T)
{
Push(S, T);
printf("%d", T->Data);
T = T->Left;
}
if (!isEmpty(S))
{
Pop(S);
T = T->Right;
}
}
}
void PreOrderTraversal(BinTree BT)
{
if (BT)
{
printf("%d", BT->Data);
PreOrderTraversal(BT->Left);
PreOrderTraversal(BT->Right);
}
}
void InOrderTraversal(BinTree BT)
{
BinTree T = BT;
Stack S = CreateStack();
while (T || !isEmpty(S))
{
while (T)
{
Push(S, T);
T = T->Left;
}
if (!isEmpty(S))
{
T = Pop(S);
printf("%d", T->Data);
T = T->Right;
}
}
}
void InOrderTraversal(BinTree BT)
{
if (BT)
{
InOrderTraversal(BT->Left);
printf("%d", BT->Data);
InOrderTraversal(BT->Right);
}
}
void PostOrderTraversal(BinTree BT)
{
BinTree T = BT;
Stack S = CreateStack();
vector<BinTree> v;
Push(S, T);
while (!isEmpty(S))
{
T = Pop(S);
v.push_back(T);
if (T->Left)
Push(S, T->Left);
if (T->Right)
Push(S, T->Right);
}
reverse(v.begin(), v.end());
for (int i = 0; i < v.size(); i++)
printf("%d", v[i]->Data);
}
void PostOrderTraversal(BinTree BT)
{
if (BT)
{
PostOrderTraversal(BT->Left);
PostOrderTraversal(BT->Right);
printf("%d", BT->Data);
}
}
void LevelOrderTraversal(BinTree BT)
{
queue<BinTree> q;
BinTree T;
if (!BT)
return;
q.push(BT);
while (!q.empty())
{
T = q.front();
q.pop();
printf("%d", T->Data);
if (T->Left)
q.push(T->Left);
if (T->Right)
q.push(T->Right);
}
}
线索化二叉树
中序
typedef struct ThreadNode
{
int data;
struct ThreadNode *lchild, *rchild;
int ltag, rtag;
} ThreadNode, *ThreadTree;
void InThread(ThreadTree &p, ThreadTree &pre)
{
if (p != NULL)
{
InThread(p->lchild, p);
if (p->lchild != NULL)
{
p->lchild = pre;
p->ltag = 1;
}
if (pre != NULL && pre->rchild == NULL)
{
pre->rchild = p;
pre->rtag = 1;
}
pre = p;
InThread(p->rchild, pre);
}
}
void CreateInThread(ThreadTree T)
{
ThreadTree pre = NULL;
if (T != NULL)
{
InThread(T, pre);
pre->rchild = NULL;
pre->rtag = 1;
}
}
树的存储
#define MAX_TREE_SIZE 100
typedef struct
{
int data;
int parent;
} PTNode;
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int n;
} PTree;
struct CTNode
{
int child;
struct CTNode *next;
};
typedef struct
{
int data;
struct CTNode *firstChild;
} CTBox;
typedef struct
{
CTBox nodes[MAX_TREE_SIZE];
int n, r;
} CTree;
typedef struct CSNode
{
int data;
struct CSNode *firstchild, *nextsibling;
} CSNode, *CSTree;
并查集
#define SIZE 13
int UFSets[SIZE];
void Initial(int S[])
{
for (int i = 0; i < SIZE; i++)
{
S[i] = -1;
}
}
int Find(int S[], int x)
{
while (S[x] >= 0)
x = S[x];
return x;
}
void Unions(int S[], int Root1, int Root2)
{
if (Root1 == Root2)
return;
S[Root2] = Root1;
}
图
#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct
{
VertexType vex[MaxVertexNum];
EdgeType edge[MaxVertexNum][MaxVertexNum];
int vexnum, arcnum;
} MGraph;
#define MaxVertexNum 100
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
};
typedef struct VNode
{
VertexType data;
ArcNode *firstarc;
} VNode, AdjList[MaxVertexNum];
typedef struct
{
AdjList vertices;
int vexnum, arcnum;
} ALGraph;