• 算法实验 层序列表问题(二叉树)


    问题描写叙述:对树中结点按层序列表是指先列树根,然后从左到右一次列出全部深度为1的节点,再从做到右地列出深度为2的节点,等等。层序列表问题要求对一颗给定的二叉树按层序列表。

    数据输入:第一行为一个整数n,表示给定的二叉树有n个顶点。接下来的n行中,每行有3个整数a,b,c 分别表示编号为a的节点的左儿子b和右儿子c。

    5
    1 4 2
    4 3 0
    2 5 0
    3 0 0
    5 0 0


    output:

    1 4 2 3 5

    代码:

    #include<iostream>
    #include<queue>
    using namespace std;
    //全局变量
    int t1,t2,t3;
    typedef struct BTNode
    {  
    	int  data ;
    	struct BTNode *Lchild , *Rchild ;
    }BTNode ;
    queue<BTNode *> q;
    void  *Preorder_Create_BTree(BTNode  *&T,int k);
    void InOrder(BTNode *t);
    void InOrder(BTNode *t);
    void add(BTNode *&t,int m)
    {  
        if (t){ // T=NULL时,二叉树为空树,不做不论什么操作
    		if(t->data == m)//符合条件,则进行左孩子和右孩子加入
    		{
    			Preorder_Create_BTree(t->Lchild,t2);
    			Preorder_Create_BTree(t->Rchild,t3);		
    		}// 通过函数指针*visit訪问根结点,以便灵活完毕对应的操作
    		else
    		add(t->Lchild,m);   // 中序遍历左子树
    		add(t->Rchild,m); // 中序遍历右子树
        }
    }
    /*
    //前序遍历
    void InOrder(BTNode *t)
    {  
        if (t){ // T=NULL时,二叉树为空树,不做不论什么操作
    		cout<<t->data<<" "; // 通过函数指针*visit訪问根结点,以便灵活完毕对应的操作
    		InOrder(t->Lchild);   // 中序遍历左子树
    		InOrder(t->Rchild); // 中序遍历右子树
        }
    }
    */
    
    //层序遍历
    void levelOrder(BTNode *t)
    {
    	BTNode *k;
    	q.push(t);
    	while(!q.empty())
    	{
    		k = q.front();
    		q.pop();
    		cout<<k->data<<" ";
    		if(k->Lchild) q.push(k->Lchild);
    		if(k->Rchild) q.push(k->Rchild);
    	}
    }
    
    int main()
    {	int n,i,flag= 1;
    	BTNode * bt;
    	Preorder_Create_BTree(bt,0);
    	cin>>n;
    	
    	for(i=0;i<n;i++)
    	{
    		cin>>t1>>t2>>t3;
    		if(flag)//第一次应该先加入节点
    		{
    			Preorder_Create_BTree(bt,t1);
    			Preorder_Create_BTree(bt->Lchild,t2);
    			Preorder_Create_BTree(bt->Rchild,t3);
    			flag = 0;
    		}
    //	
    		else//之后每加入一次须要再遍历二叉树,符合条件然后加入
    		add(bt,t1);
    	}
    //	cout<<"中序遍历:";
    //	InOrder(bt);
    //	cout<<endl;
    	levelOrder(bt);
    	return 0;
    }
    
    
    void  *Preorder_Create_BTree(BTNode  *&T,int k)
     /*   建立链式二叉树,返回指向根结点的指针变量  */
    {   
    //	char ch ; 
    //	ch=getchar() ;
    	if  (k==0) 
    	{    
    		T=NULL;  
    		return(T) ;  
    	}
    	else
    	{  
    		T=(BTNode *)malloc(sizeof(BTNode)) ;
    		T->data=k;
    		Preorder_Create_BTree(T->Lchild,0) ;
    		Preorder_Create_BTree(T->Rchild,0) ;
    		 
    	}
    }      
    


  • 相关阅读:
    内嵌汇编简介(转)
    binary hacks读数笔记(dlopen、dlsym、dlerror、dlclose)
    在Ubuntu 20.04 LTS Focal Fossa上安装Fail2ban
    如何在CentOS 8上安装和配置Fail2ban
    Linux中使用Head命令的7种方法
    如何在CentOS / RHEL上安装Nginx
    如何在Fedora 32/31/30上安装NVM?
    如何在Ubuntu 20.04 LTS Focal Fossa上安装WildFly?
    如何在CentOS 8上安装oVirt虚拟机管理器
    如何在CentOS 8上安装CentOS Web面板?
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4469558.html
Copyright © 2020-2023  润新知