查找二叉树
已知一棵二叉树用邻接表结构存储,中序查找二叉树中值为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 }
小球
许多的小球一个一个的从一棵满二叉树上掉下来组成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 }
扩展二叉树
扩展二叉树的先序序列。输出其中序和后序序列。
先是不知道脑子里在想什么骚操作,后来又是脑子一热在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 }
二叉树的繁茂度
一个二叉树的繁茂度定义为各层结点数与树的高度的乘积。 用广义表表示的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 }