• Uva 122 树的层次遍历 Trees on the level lrj白书 p149


    是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点

    所以需要采用动态结构

    • 首先要读取结点,建立二叉树addnode()+read_input()承担这样的工作
    • 然后遍历二叉树,读取结点编号输出bfs()

    这道题有内存池应用的背景

    附链接  http://blog.csdn.net/shawngucas/article/details/6574863

    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <queue>
    using namespace std;
    const int maxn=256+5;
    bool failed;
    char s[maxn];
    struct Node{
    	bool have_value;//是否被赋值过
    	int v;//结点值
    	Node *left,*right;
    	Node():have_value(false),left(NULL),right(NULL){}//构造函数
    };
    Node* root;//二叉树的根节点,指针类型给了,但是指针是空的
    //如果要定义一棵二叉树,一般是要定义一个“结点”类型的struct(如叫Node),
    //然后保存树根的指针(Node *root)
    
    Node * newnode(){
    	return new Node();
    }
    //程序动态申请内存,请注意内存泄漏
    void remove_tree(Node *u){
        //后序遍历 先递归地把当前结点的左子树删除 再递归地把当前结点的右子树删除完,最后考虑当前结点
       if(u==NULL) return ;
       remove_tree(u->left);
       remove_tree(u->right);
       delete u;
       /*
       //前序遍历
       delete u;
       remove_tree(u->left);
       remove_tree(u->right);
       //中序遍历
       remove_tree(u->left);
       delete u;
       remove(u->right);
       */
    }
    //addnode(11,"LL)")
    void addnode(int v,char* s){
    	int n=strlen(s);
    	Node* u =root;
    	for(int i=0;i<n;i++)
    		if(s[i]=='L'){                 //左子结点如果空建立新结点
    			if(u->left==NULL){
    				u->left=newnode();
    			}
    				u=u->left;
    		}
    		else if(s[i]=='R'){            //右子结点如果空建立新结点
    			if(u->right==NULL){
    				u->right=newnode();
    			}
    				u=u->right;
    		}
    		if (u->have_value) failed=true; //这里错了,先忍着,主函数再说
    		u->v=v;
    		u->have_value=true;
        }
    bool read_input(){
    	failed=false;//初始化成功
    	remove_tree(root);//先回收树
    	root=newnode();//创建根结点
    	for(;;){
    		if(scanf("%s",s)!=1) return false;//!!整个输入结束
    		if(!strcmp(s,"()")) break;
    		int v;
    		sscanf(&s[1],"%d",&v);//(11,LL)对应11,LL)
    		addnode(v,strchr(s,',')+1);//查找逗号,然后插入结点
    	}
    	return true;
    }
    //包括用vector ans记录树结点编号的工作
    bool bfs(vector <int> &ans){
    	queue<Node*> q;
    	ans.clear();
    	q.push(root);//队列中初始只有一个根结点
    	while(!q.empty()){
    		Node* u=q.front();q.pop();
    		if(!u->have_value) return false;
    		ans.push_back(u->v);//增加结点值到输出序列尾部
    		if(u->left!=NULL) q.push(u->left);//让左子结点进队(如果有的话)
    		if(u->right!=NULL) q.push(u->right);//让右子结点进队(如果有的话)
    	}
    	return true;
    }
    int main(){
    	vector <int> ans;
    	while(read_input()){
    		if(!bfs(ans)) failed=true;//最后一层判断输入是否正确
    		if(failed) printf("not complete
    ");
    		else {
    			for (int i=0;i<ans.size();i++){
    				printf(" ");
    				printf("%d",ans[i]);
    			}
    			printf("
    ");
    		}
    	}
    	return 0;
    }
    

      

    认准了,就去做,不跟风,不动摇
  • 相关阅读:
    避免数据脏读
    OGG配置文件中参数化的运用
    GoldenGate基于中间队列文件的初始化
    一次linux中毒,挖矿病毒
    goldengate新版本中查看日志读取点
    dlopen用法参数flag介绍
    gdb调试带参数和调试core
    在现有的git服务器上面创建新的repo
    Play Old Diablo 2 on macOS Catalina
    Odoo中的Environment对象
  • 原文地址:https://www.cnblogs.com/mdz-great-world/p/6392232.html
Copyright © 2020-2023  润新知