#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define Yes 1
#define No 0
typedef char ElemType;
typedef short Status;
struct BiTreeNode/* 二叉树结点定义 */
{
ElemType data;
struct BiTreeNode *LChild;/* 左孩子指针 */
struct BiTreeNode *RChild;/* 右孩子指针 */
};
struct StackNode/* 链栈结点 */
{
struct BiTreeNode *pointer;/* 存储二叉树的根结点地址 */
struct StackNode *next;
};
struct QueueNode/* 链队列结点 */
{
struct BiTreeNode *pointer;/* 存储二叉树的根结点地址 */
struct QueueNode *next;
};
struct QueueInfo/* 链队列信息结点 */
{
QueueNode *Qfront;/* 队头指针 */
QueueNode *Qrear;/* 队尾指针 */
};
/* */
void CreateBiTree(BiTreeNode* &T);
void PreOrderTraverse(BiTreeNode*&T);
void InOrderTraverse(BiTreeNode* &T);
void PostOrderTraverse(BiTreeNode* &T);
short Depth(BiTreeNode* &T);
short NodeCount(BiTreeNode* &T);
void CopyBiTree(BiTreeNode* &T, BiTreeNode* &newT);
Status InitStack(StackNode* &S);
Status Push(StackNode* &S, BiTreeNode *T);
Status Pop(StackNode* &S, BiTreeNode* &T);
Status StackEmpty(StackNode* &S);
void InOrderTraverse_NotRecursion(BiTreeNode* &T);
Status InitQueue(QueueInfo* &Q_Info);
Status EnQueue(QueueInfo* &Q_Info, BiTreeNode *T);
Status DeQueue(QueueInfo* &Q_Info, BiTreeNode* &T);
Status QueueEmpty(QueueInfo* &Q_Info);
short GetQueueLength(QueueInfo* &Q_Info);
BiTreeNode* GetQueueTop(struct QueueInfo* &Q_Info);
void LevelTraverse(BiTreeNode* &T);
short LeafNodeCount(BiTreeNode* &T);
Status BiTreeCompare(BiTreeNode* &T1, BiTreeNode* &T2);
short Degree1_NodeCount(BiTreeNode* &T);
short MaxWidth(BiTreeNode* &T);
short GetMax(short x, short y);
Status LevelTraverse2(BiTreeNode* &T);
/* */
int main()
{
BiTreeNode *root;/* 树根指针 */
BiTreeNode *copy_root;/* 二叉树复制品的根指针 */
CreateBiTree(root);
LevelTraverse2(root);
}
/* 层序遍历二叉树, 并按层输出(每一层占用单独一行) */
Status LevelTraverse2(BiTreeNode* &T)
{
short i;
short width;
struct QueueInfo *Q_Info;
struct BiTreeNode *p;
struct BiTreeNode *q;
InitQueue(Q_Info);/* 初始化链队列 */
if(T != NULL)/* T不空 */
{
EnQueue(Q_Info, T);/* 根结点进队 */
}
while(QueueEmpty(Q_Info) != Yes)/* 只要队列不空 */
{
width = GetQueueLength(Q_Info);
/* */
for(i = 0; i < width; i ++)
{
DeQueue(Q_Info, q);/* 队头元素出队 */
fprintf(stdout, "%c ", q -> data);/* 访问出队元素 */
if(q -> LChild != NULL)/* 出队元素左孩子不空, 就将左孩子进队 */
{
EnQueue(Q_Info, q -> LChild);
}
if(q -> RChild != NULL)/* 出队元素右孩子不空, 就将右孩子进队 */
{
二叉树基本操作集合
最新推荐文章于 2022-07-26 19:26:58 发布