二叉树

时间:2019-08-25
本文章向大家介绍二叉树,主要包括二叉树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

查找二叉树

已知一棵二叉树用邻接表结构存储,中序查找二叉树中值为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\n",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\n",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("\n");
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

原文地址:https://www.cnblogs.com/Aaaamber/p/11408348.html