栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言二叉树遍历

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言二叉树遍历

      该篇文章为学校数据结构实验代码,包括二叉树的深度优先遍历与广度优先遍历 ,分别包括了递归与非递归的形式。

#include
#include
#define MAXSIZE 50
typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

typedef struct					//栈
{
	BiTNode* data[MAXSIZE];
	int top;
}SqStack;

//初始化栈
SqStack* InitStack(SqStack* s)
{
	s = (SqStack*)malloc(sizeof(SqStack));
	s->top = -1;
	return s;
}

//销毁栈
void DestroySqStack(SqStack* s)
{
	free(s);
}

//判断栈是否为空
int StackEmpty(SqStack* s)
{
	if (s->top == -1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//进栈
void push(SqStack* s, BiTNode* p)
{
	if(s->top == MAXSIZE-1)
	{
		return;
	}
	s->top++;
	s->data[s->top] = p;
}

//出栈
SqStack* pop(SqStack* s)
{
	if (s->top == -1)
	{
		return NULL;
	}
	s->top--;
	return s;
}

//取栈顶
BiTNode* GetTop(SqStack* s)
{
	if (s->top == -1)
	{
		return NULL;
	}
	return s->data[s->top];
}

void CreateBiTree(BiTree *T)
{
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
        *T=NULL;
    else
    {
        *T=(BiTree  )malloc(sizeof(BiTNode));
        (*T)->data=ch;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
}

//二叉树的先序遍历
void PreOrderTraverse(BiTree T)
{
    if(T==NULL)
        return ;
    printf("%c ",T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}
 
void InOrderTraverse(BiTree T)//二叉树的中序遍历
{
   if(T==NULL)
       return ;
   InOrderTraverse(T->lchild);
   printf("%c ",T->data);
   InOrderTraverse(T->rchild);
}
 

void PostOrderTraverse(BiTree T)//后序遍历
{
    if(T==NULL)
        return;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c ",T->data);
}

//递归求二叉树的深度
int TreeDeep1(BiTree T)
{
	if (T == NULL)
		return 0;
	else
	{
		int leftdeep = TreeDeep1(T->lchild);
		int rightdeep = TreeDeep1(T->rchild);
		if (leftdeep >= rightdeep)
			return leftdeep+1;
		else
			return rightdeep+1;
	}
}

void PreOrder1(BiTNode* root)
{
    if (root == NULL)
        return;
    BiTNode* p = root;
    SqStack* s = NULL;
    s = InitStack(s);
    while (!StackEmpty(s) || p != NULL)
    {
        while (p)
        {
            printf("%c ", p->data);
            push(s, p);
            p = p->lchild;
        }
        if (!StackEmpty(s) )
        {
            p=GetTop(s);
            s=pop(s);
            p = p->rchild;
        }
    }
}

//非递归中序遍历 
void InOrder1(BiTNode* b)
{
	
    if (b == NULL)
        return;
    BiTNode* p = b;
    SqStack* s = NULL;
    s = InitStack(s);
    while (!StackEmpty(s) || p != NULL)
    {
        //一直遍历到左子树最下边,边遍历边保存根节点到栈中 
		while (p)	
        {
        	push(s, p);
            p = p->lchild;
        }
        if (!StackEmpty(s))
        {
            p=GetTop(s);
            s=pop(s);
            printf("%c ", p->data);
            p = p->rchild;
        }
    }
}

//后序遍历
void PostOrder1(BiTNode* root)
{
    if (root == NULL)
        return;
    SqStack* s = NULL;
    s = InitStack(s);
    BiTNode* pCur, *pLastVisit;

    pCur = root;
    pLastVisit = NULL;
    while (pCur)
    {
        push(s,pCur);
        pCur = pCur->lchild;
    }
    while (!StackEmpty(s))
    {
        pCur = GetTop(s);
        s=pop(s);
        if (pCur->rchild == NULL || pCur->rchild == pLastVisit)
        {
        	printf("%c ", pCur->data);
            pLastVisit = pCur;
        }
        else
        {
            push(s,pCur);
            pCur = pCur->rchild;
            while (pCur)
            {
                push(s,pCur);
                pCur = pCur->lchild;
            }
        }
    }
}



int TreeDeep2(BiTree T) //非递归求二叉树深度
{
	if (T == NULL)//树空返回0
		return 0;
	else
	{
		BiTree Q[MAXSIZE];//定义一个足够储存树中所有元素的队列
		int front = -1, rear = -1;//front为队头,rear为队尾
		int last = 0, level = 0;//last指向当前层最右节点
		rear++;//指针加一头节点入队
		Q[rear] = T;
		BiTree P =NULL;//定义一个运动指针
		while (front < rear)
		{
			front++;//队头指针加一,队头元素出队
			P = Q[front];
			if (P->lchild != NULL)//左子树不为空,左孩子入队
			{
				rear++;
				Q[rear] = P->lchild;
			}
			if (P->rchild != NULL)//右子树不为空,右孩子入队
			{
				rear++;
				Q[rear] = P->rchild;
			}
			if (front == last)//处理该层最右节点
			{
				level++;//层数加一
				last = rear;//last指向下一层最右节点
			}
 
		}//else
		return level;//返回树的深度
	}//while
 
}

int main()
{
	int m;
    BiTree T;
    CreateBiTree(&T);
    
    printf("n前序遍历:n"); 
    PreOrderTraverse (T);
    printf("n");
    PreOrder1(T);
    
    printf("n中序遍历:n");
    InOrderTraverse(T);
    printf("n");
    InOrder1(T);
    
    printf("n后序遍历:n"); 
    PostOrderTraverse(T);
    printf("n");
    PostOrder1(T);
    
    printf("n深度n");
    m=TreeDeep1(T);
    printf("%d",m);
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935016.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号