详细了解C语言二叉树的建立与遍历
admin
2023-05-02 05:20:12
目录

    这里给一个样例树:

    代码:

    #include  
    #include 
    #include 
    /*    二叉树的二叉链表结点结构定义     */
    typedef struct BiTNode
    {
        char data;
        struct BiTNode *lchild,*rchild;
    }BiTNode,*BiTree;
    BiTree T=NULL;
    /*    先序遍历建立一个二叉树    */
    void Create (BiTree *T)       //    二级指针改变地址的地址
    {
        char ch;
        scanf("%c",&ch);
        if(ch=='#')
            *T=NULL;
        else
        {
            *T=(BiTree)malloc(sizeof(BiTNode));
            if(!*T)
                return ;
            else
            {
                (*T)->data=ch;
                Create(&(*T)->lchild);
                Create(&(*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 main()
    {
        printf("请按先序遍历的结果输入树,例如:ABDH#K###E##CFI###G#J##\n");
        Create(&T);
        printf("先序遍历的结果为:\n");
        PreOrderTraverse(T);
        printf("\n");
        printf("中序遍历的结果为:\n");
        InOrderTraverse(T);
        printf("\n");
        printf("后序遍历的结果为:\n");
        PostOrderTraverse(T);
        printf("\n");
        return 0;
    }
    

    输出结果如下

    PS:下面是一个用C++里面的取引用代替了二级指针

    #include
    using namespace std;
    /*    二叉树的二叉链表结点结构定义     */
    typedef struct BiTNode
    {
        char data;
        struct BiTNode *lchild,*rchild;
    }BiTNode,*BiTree;
    BiTree T=NULL;
    /*    先序遍历建立一个二叉树    */
    void Create (BiTree &T)        //    C++取引用
    {
        char ch;
        scanf("%c",&ch);
        if(ch=='#')
            T=NULL;
        else
        {
            T=(BiTree)malloc(sizeof(BiTNode));
            if(!T)
                return ;
            else
            {
                T->data=ch;
                Create(T->lchild);
                Create(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 main()
    {
        printf("请按先序遍历的结果输入树,例如:ABDH#K###E##CFI###G#J##\n");
        Create(T);
        printf("先序遍历的结果为:\n");
        PreOrderTraverse(T);
        printf("\n");
        printf("中序遍历的结果为:\n");
        InOrderTraverse(T);
        printf("\n");
        printf("后序遍历的结果为:\n");
        PostOrderTraverse(T);
        printf("\n");
        return 0;
    }
    

    PS:遍历的PLus版,想要的自取。

    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    const int cmax=1e2+5;
    typedef struct BiTNode 
    {
    	char data;
    	struct BiTNode *lchild ,*rchild;
    }BiTNode,*BiTree;
    void CreateBiTree (BiTree &T)
    {
    	char ch;
    	scanf("%c",&ch);
    	if(ch=='#')
    	T=NULL;
    	else
    	{
    		T=(BiTNode *)malloc(sizeof(BiTNode));
    		T->data=ch;
    		CreateBiTree(T->lchild);
    		CreateBiTree(T->rchild);
    	}
    	return ; 
    }
    void PreOrder(BiTree T)
    {
    	if(T)
    	{
    		printf("%c",T->data);
    		PreOrder(T->lchild);
    		PreOrder(T->rchild);
    	}
    }
    void InOrder(BiTree T)
    {
    	if(T)
    	{
    		InOrder(T->lchild);
    		printf("%c",T->data);
    		InOrder(T->rchild);
    	}
    }
    void PostOrder(BiTree T)
    {
    	if(T)
    	{
    		PostOrder(T->lchild);
    		PostOrder(T->rchild);
    		printf("%c",T->data);
    	}
    }
    //   非递归中序遍历 
    void InOrderTraverse(BiTree T) 
    {
    	stack S;
    	BiTree p;
    	S.push(T);
    	while(!S.empty())
    	{
    		p=new BiTNode;
    		while((p=S.top())&&p)
    		    S.push(p->lchild);
    		S.pop();
    		if(!S.empty())
    		{
    			p=S.top();
    			S.pop();
    			cout<data<<"  ";
    			S.push(p->rchild); 
    		 } 
    	 } 
    }
    //    先序非递归遍历
    void PreOrder_Nonrecursive(BiTree T)
    {
    	stack S;
    	BiTree p;
    	S.push(T);
    	while(!S.empty())
    	{
    		while((p=S.top())&&p)
    		{
    			cout<data<<"  ";
    			S.push(p->lchild); 
    		 } 
    		S.pop();
    		if(!S.empty())
    		{
    			p=S.top();
    			S.pop();
    			S.push(p->rchild);
    		 } 
    	}
     } 
     int visit(BiTree T)
     {
     	if(T)
     	{
     		printf("%c ",T->data);
     		return 1;
    	 }
    	else
    	return 0;
     }
     //    非递归层次遍历
     void  LeverTraverse(BiTree T)
     {
     	queue  Q;
     	BiTree p;
     	p=T;
     	if(visit(p)==1)
     	    Q.push(p);
     	while(!Q.empty())
     	{
     		p=Q.front();
     		Q.pop();
     		if(visit(p->lchild)==1)
     		    Q.push(p->lchild);
     		if(visit(p->rchild)==1)
     		    Q.push(p->rchild);
    	 }
     }
    //主函数
    int main()
    {
    	BiTree T;
    	char j;
    	int flag=1;
    	printf("本程序实现二叉树的操作。\n");
        printf("叶子结点以#表示。\n");
        printf("可以进行建立二叉树,递归先序、中序、后序遍历,非递归先序、中序遍历及非递归层序遍历等操作。\n");
        printf("请建立二叉树。\n");
        printf("建树将以三个空格后回车结束。\n");
        printf("例如:1 2 3 4 5 6       (回车)\n\n");
    	CreateBiTree(T);           //初始化队列
        getchar();
        printf("\n");
        printf("请选择: \n");
        printf("1.递归先序遍历\n");
        printf("2.递归中序遍历\n");
        printf("3.递归后序遍历\n");
        printf("4.非递归中序遍历\n");
        printf("5.非递归先序遍历\n");
        printf("6.非递归层序遍历\n");
        printf("0.退出程序\n");
        while(flag)
        {
            scanf(" %c",&j);
            switch(j)
            {
                case '1':if(T)
                {
                    printf("递归先序遍历二叉树:");
                    PreOrder(T);
                    printf("\n");
                }
                else printf("二叉树为空!\n");
                break;
                case '2':if(T)
                {
                    printf("递归中序遍历二叉树:");
                    InOrder(T);
                    printf("\n");
                }
                else printf("二叉树为空!\n");
                break;
                case '3':if(T)
                {
                    printf("递归后序遍历二叉树:");
                    PostOrder(T);
                    printf("\n");
                }
                else printf("二叉树为空!\n");
                break;
                case '4':if(T)
                {
                    printf("非递归中序遍历二叉树:");
                    InOrderTraverse(T);
                    printf("\n");
                }
                else printf("二叉树为空!\n");
                break;
                case '5':if(T)
                {
                    printf("非递归先序遍历二叉树:");
                    PreOrder_Nonrecursive(T);
                    printf("\n");
                }
                else printf("二叉树为空!\n");
                break;
                case '6':if(T)
                {
                    printf("非递归层序遍历二叉树:");
                    LeverTraverse(T);
                    printf("\n");
                }
                else printf("二叉树为空!\n");
                break;
                default:flag=0;printf("程序运行结束,按任意键退出!\n");
            }
        }
    }
    

    总结

    本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注趣讯吧的更多内容!

    相关内容

    热门资讯

    demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
    苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
    世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
    长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
    猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
    阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
    应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
    脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
    demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
    北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
    苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
    长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
    脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
    应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
    阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
    猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
    demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...