Boring Homework 二叉搜索树的打印,模拟

来源:互联网 发布:电脑ie卸载软件 编辑:程序博客网 时间:2024/06/11 20:24

写了好长时间,注意递归的使用,思路一定要清晰。

还有注意的地方:打印的时候一定要先打印到缓存buffer中,然后再输出到屏幕上面。

#include <bits/stdc++.h>using namespace std;int idx = 0;int val[100],lft[100],rgt[100];int num[100][2];int root;void insert(int &rt,int x){if(rt == 0) {rt = ++idx;val[rt] = x;}else{if(x > val[rt]) {insert(rgt[rt],x);num[rt][1]++;}else{insert(lft[rt],x);num[rt][0]++;}}}char buf[200][200];int endpos[200];int cnt = 0;int print(int rt,int beg,int &hd,int line){int f = 0;int sm1,sm2,end,endn = 0;if(lft[rt]){int hd1;sm1 = num[rt][0];print(lft[rt],beg,hd1,line+2);hd = sm1+beg;for(int i = beg;i <= hd;i++) buf[line][i] = buf[line+1][i] = ' ';buf[line+1][hd1] = '|';endn = hd1+1;buf[line][hd1] = '+';for(int i = hd1+1;i < hd;++i) buf[line][i] = '-';f = 1;}else{hd = beg;}buf[line][hd] = 'o';end = hd+1;if(rgt[rt]){int hd2 = 0;print(rgt[rt],hd+1,hd2,line+2);for(int i = hd;i < hd2;++i)buf[line+1][i] = ' ';buf[line+1][hd2] = '|';endn = hd2+1;buf[line][hd2] = '+';for(int i = hd+1;i < hd2;i++) buf[line][i] = '-';end = hd2+1;f = 1;}//buf[line+1][endn] = buf[line][end] = 0;endpos[line+1] = max(endpos[line+1],endn);endpos[line] = max(endpos[line],end);cnt = max(cnt,line+f);}int main(){int T,cas = 0;cin>>T;while(T--){idx = 0;cnt = 0;memset(num,0,sizeof(num));memset(lft,0,sizeof(lft));memset(rgt,0,sizeof(rgt));memset(val,0,sizeof(val));memset(endpos,0,sizeof(endpos));for(int i = 0;i < 200;++i) for(int j = 0;j < 200;j++) buf[i][j] = ' ';//memset(val,-1,sizeof(val));int n;scanf("%d",&n);root = 0;for(int i = 0;i < n;++i){int tmp;scanf("%d",&tmp);insert(root,tmp);}printf("Case #%d:\n",++cas);int hd;print(1,0,hd,0);for(int i = 0;i <= cnt;++i) buf[i][endpos[i]] = 0;for(int i = 0;i <= cnt;++i) puts(buf[i]);}return 0;}/*1003 1 3 2*/