二叉树题解

1//第一题
2/*这道题主要考的是n0与n2之间的关系
3只要知道三个式子就行
4n=n0+n1+n2
5e=n1+2*n2
6n=e+1
7就可以解出n2=n0-1*/
8#include<bits/stdc++.h>
9using namespace std;
10int main()
11{
12    int n0;
13    cin>>n0;
14    int n2=n0-1;
15    cout<<n2;
16}
17/*第二题
18这个就是课上讲的最大值与最小值,就是全满和只有一条线
19全满就是一个个2的平方相加*/
20#include<bits/stdc++.h>
21using namespace std;
22int main()
23{
24    int h;
25    cin>>h;
26    int ans=0;
27    for(int i=0;i<h-1;i++)
28    {
29        
30        ans+=pow(2,i);
31    }
32    if(h==1)
33    cout<<"1"<<" "<<"1";
34    else
35    {
36        cout<<h<<" "<<ans+pow(2,h-1);
37    }
38    
39}
40/*第三题
41这道题跟第二题异曲同工,除了特殊的例子1之外,就是最大值的情况*/
42#include<bits/stdc++.h>
43using namespace std;
44int main()
45{
46    int h,n;
47    while(cin>>h>>n)
48    {
49    int ans=0;
50    for(int i=0;i<=h-1;i++)
51    ans+=pow(2,i);
52    if(h==1)
53    {
54        if(n==1)
55        cout<<"YES"<<endl;
56        else
57        {
58            cout<<"NO"<<endl;
59        }
60        
61    }
62    else
63    {
64        if(n==ans)
65        cout<<"YES"<<endl;
66        else
67        {
68            cout<<"NO"<<endl;
69        }
70        
71    }
72    
73    }
74}
75/*第四题
76这道题是层次遍历的排序,将二叉树存在一个数组里,子为n*2+1和*n*2+2,父就反过来就可以*/
77#include<bits/stdc++.h>
78using namespace std;
79int main()
80{
81    int n;
82    while(cin>>n)
83    {
84        int f,z1,z2;
85        f=(n-1)/2;
86        z1=n*2+1;
87        z2=n*2+2;
88        if(n==0)
89        cout<<"-1"<<" "<<"1"<<" "<<"2"<<endl;
90        else
91        {
92            cout<<f<<" "<<z1<<" "<<z2<<endl;
93        }
94        
95    }
96}
97/*第五题动用了真正的二叉树结构体
98主要有用的就是Depth函数,其实就是遍历,一直左遍历,一直右遍历,取最大值*/
99#include<bits/stdc++.h>
100using namespace std;
101typedef struct BiNode
102{
103    char data;
104    BiNode *lchild ,*rchild;
105}*BiTree;
106void createBiTree(BiTree &T)
107{
108    char ch;
109    cin>>ch;
110    if(ch=='#')
111    T=nullptr;
112    else
113    {
114        T=new BiNode;
115        T->data=ch;
116        createBiTree(T->lchild);
117        createBiTree(T->rchild);
118    }
119    
120    
121}
122int Depth(BiTree &T)
123{
124    int m,n;
125    if(T==nullptr)
126    return 0;
127    else
128    {
129        m=Depth(T->lchild);
130        n=Depth(T->rchild);
131        if(m>n)
132        return m+1;
133        else
134        {
135            return n+1;
136        }
137        
138    }
139    
140}
141int main()
142{
143    int n;
144    cin>>n;
145    for(int i=0;i<n;i++)
146    {
147        BiTree T;
148        createBiTree(T);
149        cout<<Depth(T)<<endl;
150    }
151}
152/*这道题最重要的就是中,后,层次
153中:左  ,根,右依次输出
154后;左右根依次输出
155层次;遍历队列,对头出队,左右入队*/
156#include<bits/stdc++.h>
157using namespace std;
158char c;
159typedef struct BiNode
160{
161    char data;
162    BiNode *lchild ,*rchild;
163}*BiTree;
164void  createBiTree(BiTree &T,int flag)
165{
166   
167    if(flag)
168    cin>>c;
169    else
170    {
171        flag=1;
172    }
173    if(c=='\n')
174    return;
175    
176    
177        
178    
179    else
180    {
181        
182    
183    
184    if(c=='#')
185    T=nullptr;
186    else
187    {
188        
189            T=new BiNode;
190            T->data=c;
191            createBiTree(T->lchild,flag);
192            createBiTree(T->rchild,flag);
193        
194        
195    }
196    }
197    
198}
199void visit(BiTree &T)
200{
201    if(T->data!='#')
202    cout<<T->data;
203}
204void inorder(BiTree T)
205{
206    if(T!=NULL)
207    {
208        inorder(T->lchild);
209        visit(T);
210        inorder(T->rchild);
211    }
212}
213void postorder(BiTree T)
214{
215    if(T!=nullptr)
216    {
217        postorder(T->lchild);
218        postorder(T->rchild);
219        visit(T);
220        
221    }
222}
223void Leaveorder(BiTree T)
224{
225    BiTree p=T;
226    if(T==nullptr)
227    return ;
228    queue<BiTree>q;
229    q.push(p);
230    while(!q.empty())
231    {
232        p=q.front();
233        cout<<p->data;
234        q.pop();
235        if(p->lchild!=nullptr)
236        q.push(p->lchild);
237        if(p->rchild!=nullptr)
238        q.push(p->rchild);
239    }
240}
241 
242int Depth(BiTree &T)
243{
244    int m,n;
245    if(T==nullptr)
246    return 0;
247    else
248    {
249        m=Depth(T->lchild);
250        n=Depth(T->rchild);
251        if(m>n)
252        return m+1;
253        else
254        {
255            return n+1;
256        }
257        
258    }
259    
260}
261int main()
262{
263    
264   while(cin>>c)
265    {
266        
267        int flag=0;
268        BiTree T;
269        if(c=='#')
270        cout<<"  "<<endl;
271        else
272        {
273            createBiTree(T,flag);
274            inorder(T);
275            cout<<" ";
276            postorder(T);
277            cout<<" ";
278            Leaveorder(T);
279            cout<<endl;
280        }
281        getchar();
282        
283    }
284}
285/*第七题
286这道题就是假设都只有左子树
287一个个赋予位置在输出就行了*/
288void ManuallyCreateTree(BiTree &T)
289{
290    T=new BiNode;
291    T->data='a';
292    BiNode *n1=new BiNode;
293    n1->data='b';
294    BiNode *n2=new BiNode;
295    n2->data='c';
296    BiNode *n3=new BiNode;
297    n3->data='d';
298    BiNode *n4=new BiNode;
299    n4->data='e';
300    BiNode *n5=new BiNode;
301    n5->data='f';
302    T->lchild=n1,T->rchild=n4;
303    n1->lchild=n3,n1->rchild=n2;
304    n2->lchild=nullptr,n2->rchild=nullptr;
305    n3->lchild=nullptr,n3->rchild=nullptr;
306    n4->rchild=n5,n4->lchild=nullptr;
307    n5->lchild=nullptr,n5->rchild=nullptr;
308    
309}
310 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值