zoukankan      html  css  js  c++  java
  • 二叉树学习——简单入门题

    入门题一:

        输入一颗二叉树。你的任务是按从上到下、从左到右的顺序输出各个节点的值。每一个节点都依照从根节点到它的移动序列给出
    (L表示左,R表示右)。在输入中,每一个节点的左括号和右括号之间没有空格,相邻节点之间用一个空格隔开。

    每颗树的输入用一
    对空括号()结束(这对空括号不代表节点)
        注意,假设从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出了超出一次,应到输出 -1 。节点个数不超过256。

    例子输入:
        (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
        (3,L) (4,R) ()
    例子输出:
        5 4 8 11 13 4 7 2 1
        0

    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    #define maxn 256
    
    char buf[maxn];	//保存读入节点
    int failed;
    int n=0,ans[maxn];	//节点个数和输出序列 
    
    typedef struct Tnode{
    	int have_value;	//是有赋过值 
    	int v;			//节点值 
    	struct Tnode *left,*right;
    }Node;
    Node *root;	//二叉树的根节点 
    
    Node* newnode()
    {
    	Node *tmp=(Node*)malloc(sizeof(Node));
    	if(tmp!=NULL)
    	{
    		tmp->have_value=0;		//显示的初始化为0,由于malloc申请内存时并不把它清零
    		tmp->left=tmp->right=NULL; 
    	}
    	return tmp;	
    }
    
    void addnode(int value,char *s)
    {
    	int length=strlen(s);
    	Node *tmp=root;
    	for(int i=0;i<length;i++){	//索引相应的位置 
    		if('L'==s[i])
    		{
    			if(NULL==tmp->left) tmp->left=newnode();
    			tmp=tmp->left;
    		}else if('R'==s[i]){
    			if(NULL==tmp->right) tmp->right=newnode();
    			tmp=tmp->right;
    		}		
    	}
    	if(tmp->have_value) failed=1;	//已经赋过值表明输入有误 
    	tmp->v=value;	tmp->have_value=1;
    }
    
    int read_input()
    {
    	failed=0;
    	root=newnode();
    	for(;;)
    	{
    		if(scanf("%s",buf)!=1) return 0;	//整个输入结束
    		if(!strcmp(buf,"()")) break;
    		int v;
    		sscanf(&buf[1],"%d",&v);	//读入节点的值
    		addnode(v,strchr(buf,',')+1); 
    	}
    	return 1;
    } 
    
    /*  BFS,Breadth-Firsh Search  宽度优先遍历 */ 
    int bfs()
    {
    	int front=0,rear=1;
    	Node* q[maxn];
    	q[0]=root;
    	while(front<rear)
    	{
    		Node* tmp=q[front++];
    		if(tmp->have_value==0) return 0;
    		
    		ans[n++]=tmp->v;
    		if(NULL != tmp->left)  q[rear++]=tmp->left;
    		if(NULL != tmp->right) q[rear++]=tmp->right;
    	}
    	return 1;
    }
    
    void remove_tree(Node* u)
    {
    	if(NULL==u) return ;
    	remove_tree(u->left);
    	remove_tree(u->right);
    	free(u);
    }
     
    int main()
    {
    	read_input();
    	
    	if(bfs() && !failed){
    		for(int i=0;i<n;i++){
    			printf("%d ",ans[i]);
    		}
    	}else{
    		printf("0
    ");
    	}
    	return 0;
    } 
    


    入门题二:

    输入一颗二叉树的先序遍历和中序遍历,输出它的后序遍历序列。
    例子输入:
            DBACEGF ABCDEFG
            BCAD CBAD
    例子输出:
            ACBFGED
            CDAB 

    #include "stdio.h"
    #include "string.h"
    #define maxn 20
    char preorder[maxn],inorder[maxn],postOrder[maxn]; 		//先序、中序 和后序 
    
    
    //n树的节点个数,pre前序,in中序,post后序 
    void build(int n,char *pre,char *in,char *post)
    {
    	if(n<=0) return;
    	int x=strchr(in,pre[0])-in;		//找到根节点在中序遍历中的位置 
    	build(x,pre+1,in,post);			//递归构造左子树的后序遍历 
    	build(n-x-1,pre+x+1,in+x+1,post+x);		//递归构造右子树的后序遍历 
    	post[n-1]=pre[0];	//根节点加入到最后 
    }
    
    int main()
    {
    	while(scanf("%s%s",preorder,inorder)==2)
    	{
    		int n=strlen(preorder);
    		build(n,preorder,inorder,postOrder); 
    		postOrder[n]='';
    		printf("%s
    ",postOrder);		
    	} 
    	return 0;
    } 



  • 相关阅读:
    读书小记--<态度>
    frp 使用基础笔记
    ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)
    简单粗暴!解决锐捷强制关闭VMware NAT Service的问题(图文教程)
    杜教筛使用心得
    在阿里云的轻量级服务器上装桌面
    2018多校第三场 hdu6331 M :Walking Plan
    数论题集合
    hihoCoder挑战赛34 B题(快速求第k轮冒泡排序的结果)
    一阶微分边缘检测算子
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6940321.html
Copyright © 2011-2022 走看看