二叉樹的深度

題目連接:http://dsalgo.openjudge.cn/binarytree/11/ios

總時間限制: 1000ms 內存限制: 65535kB
描述

給定一棵二叉樹,求該二叉樹的深度ide

二叉樹深度定義:從根結點到葉結點依次通過的結點(含根、葉結點)造成樹的一條路徑,最長路徑的節點個數爲樹的深度spa

輸入
第一行是一個整數n,表示二叉樹的結點個數。二叉樹結點編號從1到n,根結點爲1,n <= 10
接下來有n行,依次對應二叉樹的n個節點。
每行有兩個整數,分別表示該節點的左兒子和右兒子的節點編號。若是第一個(第二個)數爲-1則表示沒有左(右)兒子
輸出
輸出一個整型數,表示樹的深度
樣例輸入
3
2 3
-1 -1
-1 -1
樣例輸出
2

分析:.net

這個題關鍵是要可以想到一個比較方便的存儲二叉樹的結構。構造好二叉樹後,計算深度的話,廣搜或深搜均可以。code

深搜:blog

 1 #include <stdio.h>
 2 int n,a[102][3];//a[i][0]表示節點i的左孩子節點編號,a[i][1]表示節點i的右孩子節點編號;a[i][2]表示i節點的父節點編號。
 3 int dfs(int root)//返回根節點編號爲root的二叉樹的高度 
 4 {
 5     if(a[root][0]==-1&&a[root][1]==-1) return 1;
 6     else 
 7     {
 8         int leftHeight=0,rightHeight=0;
 9         if(a[root][0]>0) leftHeight=dfs(a[root][0]);
10         if(a[root][1]>0) rightHeight=dfs(a[root][1]);
11         return (leftHeight>rightHeight?leftHeight:rightHeight)+1;
12     }
13 }
14 int main()
15 {
16     freopen("data.in","r",stdin);
17     int i,x,y;
18     scanf("%d",&n);
19     for(i=1;i<=n;i++)
20     {
21         scanf("%d%d",&x,&y);
22         if(x>0)
23         {
24             a[i][0]=x;//i的左孩子是x 
25             a[x][2]=i;//x的父節點是i 
26         }
27         if(y>0)
28         {
29             a[i][1]=y;//i的右孩子是y
30             a[y][2]=i;//y的父節點是i 
31         }
32     }
33     int ans=dfs(1);
34     printf("%d\n",ans);
35     return 0;
36 }
View Code

 

廣搜:隊列

 1 #include<iostream>
 2 #include<queue>
 3 using namespace std;
 4 
 5 int n,a[102][3];//a[i][0]表示節點i的左孩子節點編號,a[i][1]表示節點i的右孩子節點編號;a[i][2]表示i節點的父節點編號。
 6 struct obj
 7 {
 8     int ID;//節點編號
 9     int leval;//節點所在的層 
10 };
11 int bfs(int root)//用廣搜的方式計算並返回根節點編號爲root的二叉樹的高度
12 {
13     struct obj ttt,t2;
14     queue<struct obj> que;
15     
16     
17     ttt.ID=root;
18     ttt.leval=1;
19     que.push(ttt);
20     int maxHeight=1;
21     while(!que.empty())
22     {
23         ttt=que.front();que.pop();
24         
25         if(a[ttt.ID][0]>0)
26         {
27             t2.ID=a[ttt.ID][0];
28             t2.leval=ttt.leval+1;
29             que.push(t2);
30             if(t2.leval>maxHeight) maxHeight=t2.leval;
31         }
32         if(a[ttt.ID][1]>0)
33         {
34             t2.ID=a[ttt.ID][1];
35             t2.leval=ttt.leval+1;
36             que.push(t2);
37             if(t2.leval>maxHeight) maxHeight=t2.leval;
38         }
39     }
40     return maxHeight;
41 } 
42 int main()
43 {
44     int i,x,y;
45     scanf("%d",&n);
46     for(i=1;i<=n;i++)
47     {
48         scanf("%d%d",&x,&y);
49         if(x>0)
50         {
51             a[i][0]=x;//i的左孩子是x 
52             a[x][2]=i;//x的父節點是i 
53         }
54         if(y>0)
55         {
56             a[i][1]=y;//i的右孩子是y
57             a[y][2]=i;//y的父節點是i 
58         }
59     }
60     int ans=bfs(1);
61     printf("%d\n",ans);
62     return 0;
63 }
View Code

 

C++  STL的queue隊列能夠參考https://blog.csdn.net/qq_41785863/article/details/81630386 內存

相關文章
相關標籤/搜索