《劍指offer》:[39]求解二叉樹的深度

塵虛緣_KY發表於2016-06-19
題目:輸入一棵二叉樹的根結點,求該樹的深度。從根結點到葉子結點一次經過的結點(含根、也結點)形成樹的一條路徑,最長路徑的長度為樹的深度。
例如下圖中的二叉樹,其深度根結點到葉子結點: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;
}

執行結果是:


相關文章