zoukankan      html  css  js  c++  java
  • 二叉树

    查找二叉树

    已知一棵二叉树用邻接表结构存储,中序查找二叉树中值为x的结点,并指出是第几个结点。

    中序输出嘛!输出一个计数一个

    从第一个结点开始判断有无左子树,走完一个就cnt++,然后再走右子树。左边走完判断该结点的值是不是要查找的,输出cnt就可以了。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define N 105
     5 struct node{
     6     int data;
     7     int left,right;
     8 }num[N];
     9 int n,m,cnt;
    10 void InOrder(int v)
    11 {
    12     if(num[v].left) InOrder(num[v].left);
    13     cnt++;
    14     if(num[v].data==m){printf("%d
    ",cnt);return;}
    15     if(num[v].right) InOrder(num[v].right);
    16 }
    17 int main()
    18 {
    19     scanf("%d%d",&n,&m);
    20     for(int i=1;i<=n;i++) scanf("%d%d%d",&num[i].data,&num[i].left,&num[i].right);
    21     InOrder(1);
    22 }
    View Code

    小球

    许多的小球一个一个的从一棵满二叉树上掉下来组成FBT(Full Binary Tree,满二叉树)

    开始我还真的还建树模拟球掉下来......是我没见过世面了,后来找到规律了。贴。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 int main()
     5 {
     6     int n,m,left,right;scanf("%d%d",&n,&m);
     7     left=pow(2.0,n-1);
     8     right=pow(2.0,n);
     9     while(m)
    10     {
    11         if(m==1){printf("%d
    ",left);break;}
    12         int mid=(right-left)/2;
    13         if(m%2==0)
    14         {
    15             left+=mid;
    16             m/=2;
    17         }
    18         else{
    19             right-=mid;
    20             m=(m+1)/2;
    21         }
    22     }
    23 }
    View Code

    扩展二叉树

    扩展二叉树的先序序列。输出其中序和后序序列。

    先是不知道脑子里在想什么骚操作,后来又是脑子一热在i那里卡了很久...不知道自己在想些什么。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 struct node{
     5     char data;
     6     node *left,*right;
     7 };
     8 string s;
     9 int i=-1;
    10 node *buildtree()
    11 {
    12     ++i;
    13     node *tree=NULL;
    14     if(s[i]!='.')
    15     {
    16         tree=new node;
    17         tree->data=s[i];
    18         tree->left=buildtree();
    19         tree->right=buildtree();
    20     }
    21     return tree;
    22 }
    23 void InOrder(node *root)
    24 {
    25     if(root)
    26     {
    27         InOrder(root->left);
    28         printf("%c",root->data);
    29         InOrder(root->right);
    30     }
    31 }
    32 void PostOrder(node *root)
    33 {
    34     if(root)
    35     {
    36         PostOrder(root->left);
    37         PostOrder(root->right);
    38         printf("%c",root->data);
    39     }
    40 }
    41 int main()
    42 {
    43     cin>>s;
    44     node *root=buildtree();
    45     InOrder(root);
    46     printf("
    ");
    47     PostOrder(root);
    48 }
    View Code

    二叉树的繁茂度

    一个二叉树的繁茂度定义为各层结点数与树的高度的乘积。 用广义表表示的n棵二叉树,输出此棵树的繁茂度。

    a[up]计当前高度时的结点数,max计最高高度。最后累加得结果。

     1 #include<iostream>
     2 #include<string> 
     3 using namespace std;
     4 int main()
     5 {
     6     int n,ans,l;
     7     string s;
     8     cin>>n;
     9     while(n--)
    10     {
    11         int up=0,max=0,sum=0;
    12         int a[105]={0};
    13         cin>>s;
    14         l=s.size();
    15         for(int i=0;i<l;i++)
    16         {
    17             if(s[i]!='('&&s[i]!=')'&&s[i]!=',') a[up]++;
    18             if(s[i]=='(')
    19             {
    20                 up++;
    21                 max++;
    22             }
    23             if(s[i]==')')
    24                 up--;
    25         }
    26         for(int i=0;i<=max;i++) sum+=a[i]*i;
    27         cout<<sum<<endl;
    28     }
    29 }
    View Code
  • 相关阅读:
    bzoj 3456 城市规划 —— 分治FFT / 多项式求逆 / 指数型生成函数(多项式求ln)
    洛谷 P4721 [模板]分治FFT —— 分治FFT / 多项式求逆
    CF 438 E & bzoj 3625 小朋友和二叉树 —— 多项式开方
    Codeforces 447
    Codeforces 1099
    Codeforces 991
    Codeforces 994
    Codeforces 989
    Codeforces 1084
    xj膜你赛(n-1)
  • 原文地址:https://www.cnblogs.com/Aaaamber/p/11408348.html
Copyright © 2011-2022 走看看