【劍指offer】二叉樹深度

蘭亭風雨發表於2014-05-28

轉載請註明出處:http://blog.csdn.net/ns_code/article/details/27249675

題目描述:

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。

輸入:

第一行輸入有n,n表示結點數,結點號從1到n。根結點為1。 n <= 10。

接下來有n行,每行有兩個個整型a和b,表示第i個節點的左右孩子孩子。a為左孩子,b為右孩子。當a為-1時,沒有左孩子。當b為-1時,沒有右孩子。

輸出:

輸出一個整型,表示樹的深度。

樣例輸入:
3
2 3
-1 -1
-1 -1
樣例輸出:
2
    之前在Cracking the Coding interview中有一道根據給定有序陣列,建立一個高度最小的二叉樹的題目,最後要寫個求高度的函式,與這道題一樣。這是這次用陣列儲存二叉樹,在九度OJ上AC。

    思路很簡單,遞迴實現,程式碼如下:

#include<stdio.h>
#include<stdlib.h>


typedef struct BTNode
{
	int data;
	int rchild;
	int lchild;
}BTNode;

int max(int a,int b)
{
	return a>b ? a:b;
}

/*
求二叉樹的深度
*/
int TreeDepth(BTNode *pTree,int index)
{
	if(pTree == NULL)
		return 0;

	if(index == -1)
		return 0;
	else
		return max(TreeDepth(pTree,pTree[index].lchild),TreeDepth(pTree,pTree[index].rchild)) + 1;
}


int main()
{
	int n;
	while(scanf("%d",&n) != EOF)
	{
		BTNode *pTree = NULL;
		if(n>0)
		{
			pTree = (BTNode *)malloc(n*sizeof(BTNode));
			if(pTree == NULL)
				exit(EXIT_FAILURE);
			int i;
			//輸入n個節點的data
			for(i=0;i<n;i++)
			{
				int data1,data2;
				scanf("%d %d",&data1,&data2);
				if(data1 != -1)
					pTree[i].lchild = data1-1;
				else
					pTree[i].lchild = -1;
				if(data2 != -1)
					pTree[i].rchild = data2-1;
				else
					pTree[i].rchild = -1;
			}
		}
		printf("%d",TreeDepth(pTree,0));
	}
	return 0;
}
/**************************************************************
    Problem: 1350
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:912 kb
****************************************************************/

相關文章