洛谷——《树》

#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;

//p4715
// 1.用列队逆向获得数

// struct com
// {
//     int pow,num;
// };
// queue<com> q;//建立队列
// int ans;
// int main()
// {
//     int n;
//     cin>>n;
//     n = (1<<n);
//     com item;
//     for(int i =1;i<=n;i++)
//     {
//         item.num =i;
//         cin>>item.pow;
//         q.push(item);//入队
//     }//放入第一队伍
//     com a,b;
//     while(q.size())
//     {
//         a = q.front();q.pop();
//         b = q.front();q.pop();
//         if(q.size()==0)break;//最后剩下冠军和亚军
//         //取出前两个
//         if(a.pow>b.pow)q.push(a);
//         else q.push(b);
//         //晋级最大弄一个
//     }
//     ans = (a.pow<b.pow)?a.num:b.num;
//     cout<<ans;
// }


//p4913
// 1.找到编号为x的节点
// 2.放入左右编号
// 3.遍历获得长度
// 4.链表查找复杂度高,用顺序表

// struct build
// {
//     int left,right;
// };
// long long n,max_len;
// vector<build> arr;

// void find_h(int pos,int h)
// {
//     if(h>max_len)max_len = h;//更新最大值
//     if(arr[pos].left!=0)
//     {
//         find_h(arr[pos].left,h+1);
//     }
//     if(arr[pos].right!=0)
//     {
//         find_h(arr[pos].right,h+1);
//     }//左右递归
//     return ;
// }
// int main()
// {
//     cin>>n;
//     arr.resize(n+1);
//     for(int i =1;i<n;i++)
//     {
//         cin>>arr[i].left>>arr[i].right;
//     }//初始化
//     find_h(1,1);
//     cout<<max_len;

// }



//p1872
// 1.通过前序和中序创建数
// 2.通过数找出后序
// 3.试着用链表
// struct cow
// {
//     char name;
//     cow *left,*right;//左右数
// };
// string beg,ctr;

// void get_tree(cow* &pos,string a,string b)//分别表示要前中序字符串
// {
//     if(a.length()==0)return ;//出口
//     char ch = a[0];//获得首字母
//     pos = new cow;//分配空间
//     pos->left = NULL;pos->right = NULL;
//     pos->name = ch;//放入数据
//     string b1,b2,a1,a2;
//     int k =0;
//     while(b[k]!=ch)k++;
//     for(int i =0;i<k;i++)b1+=b[i];
//     for(int i =k+1;i<b.length();i++)b2+=b[i];//中序切割
//     for(int i =1;i<=k;i++)a1+=a[i];
//     for(int i =k+1;i<a.length();i++)a2+=a[i];
//     get_tree(pos->left,a1,b1);
//     get_tree(pos->right,a2,b2);

// }

// void print(cow *pos)
// {
//     if(pos==NULL)return;
//     print(pos->left);
//     print(pos->right);
//     cout<<pos->name;
// }
// int main()
// {
//     cow *LNode = NULL;
//     cin>>beg>>ctr;
//     get_tree(LNode,ctr,beg);
//     print(LNode);
// }


// p5076(放弃了,不会)

// int n;
// typedef struct Node
// {
//     int size,value,num;
//     Node *left,*right;
// }*NodeList;
// void InitNode(NodeList &L)
// {
//     L = new Node;
//     L->left = NULL;L->right = NULL;
//     L->size = 0;
//     L->value = 0;
// }
// inline void update(Node* &L)
// {
//     L->size = L->left->size+L->right->size+L->num;
// }
// int my_rank(int x,Node* L)
// {
//     if(x<L->value)return my_rank(x,L->left);
//     if(x>L->value)return my_rank(x,L->right)+L->left->size+L->num;
//     return L->left->size+L->num;
// }

// int kth(int x,Node* L)
// {
//     if(x<=L->left->size)return kth(x,L->left);
//     if(x<=L->left->size+L->num)return L->value;
//     return kth(x-L->left->size-L->num,L->right);
// }

// void insert(int x,Node* &L)
// {
//     if(x<L->value)
//     {
//         if(L->left==NULL)
//         {
//             L->left = new Node;
//             L->left->left = NULL;L->left->right = NULL;
//             L->left->size = 1;
//             L->left->value = x;
//         }
//         else insert(x,L->left);
//     }
//     else if(x>L->value)
//     {
//         if(L->right==NULL)
//         {
//             L->right = new Node;
//             L->right->left = NULL;L->right->right = NULL;
//             L->right->size = 1;
//             L->right->value = x;
//         }
//         else insert(x,L->right);
//     }
//     else L->num++;
//     update(L);
// }
// int main()
// {
//     cin>>n;
//     NodeList List;
//     InitNode(List);
//     for(int i =0;i<n;i++)
//     {
//         int opt,x;
//         cin>>opt>>x;
//         switch (opt)
//         {
//             case 1:
//                 cout<<my_rank(x,List)<<endl;
//                 break;
            
//             case 2:
//                 cout<<kth(x,List)<<endl;
//                 break;

//             case 3:
//                 cout<<kth(my_rank(x,List)-1,List)<<endl;
//                 break;
//             case 4:
//                 cout<<kth(my_rank(x+1,List),List)<<endl;
//                 break;
//             case 5:
//                 insert(x,List);
//                 break;
//         }
//     }
// }



//p1364
// int n,ans = 10000000;
// int arr[110];
// struct Node
// {
//     int left,right,father,value;
// }t[110];

// int cal(int x,int d)
// {
//     if(x==0||arr[x]==1)return 0;
//     arr[x] = 1;
//     return cal(t[x].left,d+1)+cal(t[x].right,d+1)+cal(t[x].father,d+1)+t[x].value*d;
// }
// int main()
// {
//     cin>>n;
//     for(int i =1;i<=n;i++)cin>>t[i].value>>t[i].left>>t[i].right;
//     for(int i =1;i<=n;i++)
//     {
//         t[t[i].left].father = i;
//         t[t[i].right].father = i;
//     }
//     for(int i =1;i<=n;i++)
//     {
//         memset(arr,0,sizeof(arr));
//         ans = min(ans,cal(i,0));
//     }
//     cout<<ans;
// }


//1229(太玄妙了)
// long long ans;
// string a,b;
// int main()
// {
//     cin>>a>>b;
//     for(int i =0;i<a.length()-1;i++)
//     {
//         for(int j =1;j<b.length();j++)
//         {
//             if(a[i]==b[j]&&a[i+1]==b[j-1])ans++;
//         }
//     }
//     cout<<(1<<ans);
// }


//p1305
// int n,ans;
// struct Node
// {
//     char value,left,right;
// }arr[100];
// struct NodeNum
// {
//     int value,left,right;
// }t[100];
// void print(int x)
// {
//     if(x==0)return;
//     cout<<arr[t[x].value].value;
//     print(t[x].left);
//     print(t[x].right);
// }
// int main()
// {
//     cin>>n;
//     for(int k =1;k<=n;k++)
//     {
//         char value,left,right;
//         cin>>value>>left>>right;
//         int i =value-'a'+1;if(k==1)ans = i;
//         arr[i].value = value;arr[i].left = left;arr[i].right = right;
//         t[i].value = arr[i].value-'a'+1;
//         if(arr[i].left=='*')t[i].left = 0;
//         else t[i].left = arr[i].left-'a'+1;
//         if(arr[i].right=='*')t[i].right = 0;
//         else t[i].right = arr[i].right-'a'+1;
//     }
//     print(ans);
// }

//p1030
// void build(string a,string b)
// {
//     if(a.empty())return ;
//     char ch = b[b.length()-1];//获得最后字符
//     int pos = a.find(ch);//找到字符位置
//     b.erase(b.length()-1);
//     string a_1 = a.substr(0,pos);
//     string a_2 = a.substr(pos+1);
//     string b_1 = b.substr(0,pos);
//     string b_2 = b.substr(pos);
//     cout<<ch;
//     build(a_1,b_1);
//     build(a_2,b_2);

// }
// string mir,last;
// int main()
// {
//     cin>>mir>>last;
//     build(mir,last);
// }



//p3884
// 1.建立树,包含节点数字,左右和父节点
// 第一个点不知道为什么wa了
// struct Node
// {
//     int left,right,value,father;
// }arr[110];
// int t[110];
// int n,x,y;
// int deep,width,dis = 10000;
// int u,v;
// void my_deep(int pos,int len)
// {
//     if(pos==0)return;
//     if(len>deep)deep = len;
//     my_deep(arr[pos].left,len+1);
//     my_deep(arr[pos].right,len+1);
// }

// void my_width()
// {
//     queue<Node> q;
//     q.push(arr[1]);//特殊处理
    
//     while (!q.empty())
//     {
//         int cout = q.size();
//         width = max(width,cout);
//         while(cout--)
//         {
//             Node item = q.front();q.pop();
//             if(arr[item.left].value)q.push(arr[item.left]);
//             if(arr[item.right].value)q.push(arr[item.right]);
//         }
//     }
// }
// // 深度优先
// void my_dis(int pos,int len)
// {
//     if(pos==v)
//     {
//         dis = min(dis,len);
//         return;
//     }
//     if(t[pos]==1||pos==0)return;
//     t[pos] = 1;
//     my_dis(arr[pos].left,arr[pos].left<pos?len+2:len+1);
//     my_dis(arr[pos].right,arr[pos].right<pos?len+2:len+1);
//     my_dis(arr[pos].father,arr[pos].father<pos?len+2:len+1);
//     t[pos] = 0;
// }
// int main()
// {
//     cin>>n;
//     for(int i =0;i<n-1;i++)
//     {
//         cin>>x>>y;
//         if(arr[x].left==0)arr[x].left = y;//优先填左边
//         else arr[x].right = y;
//     }
//     for(int i =1;i<=n;i++)
//     {
//         arr[i].value = i;
//         arr[arr[i].left].father = i;
//         arr[arr[i].right].father  = i;
//     }
//     cin>>u>>v;
//     my_deep(1,1);
//     my_width();
//     my_dis(u,0);
//     cout<<deep<<endl<<width<<endl<<dis;
// }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值