• 二叉树三种遍历调试运行版


    头文件:

    #include <stdio.h>
    struct BinaryTreeNode 
    {
        int                    m_nValue; 
        BinaryTreeNode*        m_pLeft;  
        BinaryTreeNode*        m_pRight; 
    };
    

    先序输入建立:

    void Create_BT(BinaryTreeNode *&bt)//先序输入二叉树
    {
    	int d;
    	scanf("%d",&d);
    	if(d==-1)bt=NULL;
    	else 
    	{
    		bt=(BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
    		bt->m_nValue=d;
    		Create_BT(bt->m_pLeft);
    		Create_BT(bt->m_pRight);
    	}	
    }
    

    三种遍历方法:

    void PreOrder(BinaryTreeNode *bt)
    {
    	if(bt!=NULL)
    	{
    		printf("%d\n",bt->m_nValue);
    		PreOrder(bt->m_pLeft);
    		PreOrder(bt->m_pRight);
    	}
    }
    void InOrder(BinaryTreeNode *bt)
    {
    	if(bt!=NULL)
    	{
    		InOrder(bt->m_pLeft);
    		printf("%d\n",bt->m_nValue);
    		InOrder(bt->m_pRight);
    	}
    }
    void PostOrder(BinaryTreeNode *bt)
    {
    	if(bt!=NULL)
    	{
    		PostOrder(bt->m_pLeft);
    		PostOrder(bt->m_pRight);
    		printf("%d\n",bt->m_nValue);
    	}
    }
    void PreOrderStack(BinaryTreeNode *bt)
    {
    	BinaryTreeNode *s[20];//栈
    	BinaryTreeNode *p=bt;
    	int top=-1;
    	while(p||top>-1)
    	{
    		while(p)
    		{
    			printf("%d\n",p->m_nValue);
    			s[++top]=p;
    			p=p->m_pLeft;
    		}
    		if(top>-1)
    		{
    			p=s[top];
    			top--;
    			p=p->m_pRight;
    		}
    	}
    }
    void InOrderStack(BinaryTreeNode *bt)
    {
    	BinaryTreeNode *s[20];//栈
    	BinaryTreeNode *p=bt;
    	int top=-1;
    	while(p||top>-1)
    	{
    		while(p)
    		{
    			s[++top]=p;
    			p=p->m_pLeft;
    		}
    		if(top>-1)
    		{
    			p=s[top];
    			printf("%d\n",p->m_nValue);			
    			top--;
    			p=p->m_pRight;
    		}
    	}
    }
    //后序二叉树非递归
    struct stacknode
    {
    	BinaryTreeNode *node;
    	int tag;//tag=0表示左子女已访问,tag=1表示右子女已访问
    };
    void PostOrderStack(BinaryTreeNode *bt)
    {
    	stacknode s[20];//栈
    	stacknode temp;//暂存结点信息
    	BinaryTreeNode *p=bt;
    	int top=-1;
    	while(p||top>-1)
    	{
    		while(p)
    		{
    			temp.node=p;
    			temp.tag=0;
    			s[++top]=temp;
    			p=p->m_pLeft;
    		}
    		while(top>-1&&s[top].tag==1)//右子树已访问
    		{
    			printf("%d\n",s[top--].node->m_nValue);
    		}
    		if(top>-1)
    		{
    			s[top].tag=1;
    			p=s[top].node;
    			p=p->m_pRight;
    		}
    	}
    }
    

    main函数:

    int main()
    {
    	while(true)
    	{
           BinaryTreeNode *bt;
    	   Create_BT(bt);
    	   PreOrderStack(bt);
    	   InOrderStack(bt);
    	   PostOrderStack(bt);
    	   //PreOrder(bt);
    	   //InOrder(bt);
    	   //PostOrder(bt);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    两种常用图像识别迁移学习方法
    学习备忘
    图像处理代码举例(C++、MATLAB、OpenCV)
    Java 读取clob字段的几种方法
    Oracle 查询表注释以及字段注释
    Oracle 查询表的索引包含的字段
    Oracle 获取表的主键、外键以及唯一约束条件
    Oracle列信息表 all_tab_columns中的data_length和data_precision字段区别
    Oracle 表结构、索引以及分区信息查询
    Java中的String,StringBuilder,StringBuffer三者的区别
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/2820601.html
Copyright © 2020-2023  润新知