《劍指offer》:[39]求解二叉樹的深度
題目:輸入一棵二叉樹的根結點,求該樹的深度。從根結點到葉子結點一次經過的結點(含根、也結點)形成樹的一條路徑,最長路徑的長度為樹的深度。
例如下圖中的二叉樹,其深度根結點到葉子結點:1->2->5->7,該條路徑的長度為4,所以該二叉樹的深度為4 。
方案:遞迴方法。時間複雜度大於O(N)。
在面試題25中,我們討論瞭如何用容器來記錄一個條路徑及求路徑的和的情況,但是該方法的程式碼量比較大,所以這節我們將採用更加簡潔的程式碼來實現。我們可以從另外一個角度來理解樹的深度。例如樹只有一個根結點,那麼它的深度為1.如果該樹只有右子樹沒有左子樹,該樹的深度就是右子樹的深度+1;反之左子樹的深度+1;然後在用這種思路來討論一其右子樹為根結點的二叉樹的深度。很顯然,神遞迴的思路又出現了,沒錯,因為像樹的資料結構,還有想求階乘等一些題目,其實單步的計算不復雜,但是計算量多,冗長,因為每一步乾的事兒都一樣,所以我們就可以採取遞迴的思路。
遞迴的實現程式碼如下:
#include<iostream>
using namespace std;
int arr[7]={8,5,15,3,7,16,6};
struct BinaryTree
{
int data;
BinaryTree *pLeft;
BinaryTree *pRight;
};
BinaryTree *pRoot1=NULL;
void InsertTree(BinaryTree *root, int data)
{
if(root->data>data)//插入左邊
{
if(root->pLeft==NULL)
{
root->pLeft=new BinaryTree;
root->pLeft->data=data;
root->pLeft->pLeft=root->pLeft->pRight=NULL;
}
else
{
InsertTree(root->pLeft,data);// 繼續查詢插入位置;
}
}
else
{
if(root->pRight==NULL)
{
root->pRight=new BinaryTree;
root->pRight->data=data;
root->pRight->pLeft=root->pRight->pRight=NULL;
}
else
InsertTree(root->pRight,data);
}
}
void CreateTree(BinaryTree **root,int *array,int length)
{
for(int i=0;i<length;i++)
{
if(*root==NULL)
{
BinaryTree *temp=new BinaryTree;
temp->data=array[i];
temp->pLeft=temp->pRight=NULL;
*root=temp;
}
else
InsertTree(*root,array[i]);
}
}
void PreOrder(BinaryTree *tree)
{
if(NULL!=tree)
{
cout<<tree->data<<" ";
PreOrder(tree->pLeft);
PreOrder(tree->pRight);
}
}
int TreeDepth(BinaryTree *root)
{
if(NULL==root)
return 0;
int left=TreeDepth(root->pLeft);
int right=TreeDepth(root->pRight);
return (left>right)?(left+1):(right+1);
}
int main()
{
int depth=0;
CreateTree(&pRoot1,arr,7);
cout<<"前序遍歷:";
PreOrder(pRoot1);
cout<<endl;
depth=TreeDepth(pRoot1);
cout<<"樹的深度為:"<<depth<<endl;
system("pause");
return 0;
}
執行結果是:
相關文章
- 【劍指offer】二叉樹深度二叉樹
- 劍指Offer-40-二叉樹的深度二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- 《劍指offer》:[39-1]判斷是否為平衡二叉樹二叉樹
- 劍指offer——重建二叉樹二叉樹
- 劍指offer(四)重建二叉樹二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 《劍指offer》:[59]對稱的二叉樹二叉樹
- 劍指 Offer 07. 重建二叉樹二叉樹
- 【劍指offer】判斷二叉樹平衡二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- 《劍指offer》:[62]序列化二叉樹二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- 《劍指offer》:[60]把二叉樹列印成多行二叉樹
- 【劍指offer】從上向下列印二叉樹二叉樹
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 《劍指offer》:[58]二叉樹的下一個結點二叉樹
- 劍指offer(C++)——把二叉樹列印成多行C++二叉樹
- 【劍指offer】樹的子結構
- 【劍指offer】二叉樹中和為某一值的路徑二叉樹
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 《劍指offer》:[61]按之字形順序列印二叉樹二叉樹
- 劍指 Offer 32 - III. 從上到下列印二叉樹 III二叉樹
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹
- 劍指offer-17:樹的子結構
- 劍指offer面試18 樹的子結構面試
- 劍指offer(java實現)第4題“重建二叉樹”-牛客網Java二叉樹
- 劍指 Offer 32 - I. 從上到下列印二叉樹(java解題)二叉樹Java
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- LeetCode 劍指offer——從上到下列印二叉樹 II、從上到下列印二叉樹 IIILeetCode二叉樹
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- leetcode 102 劍指Offer 32 二叉樹的層次遍歷LeetCode二叉樹
- 劍指offer 面試題 7 :二叉樹的下一個節點是什麼?面試題二叉樹