剑指offer面试题:求二叉树的深度

题目:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如下图中的二叉树的深度为4,因为它从根结点到叶结点最长的路径包含4个结点(从根结点1开始,经过结点2和结点5,最终到达叶结点7)。


 

 

解析:①如果一棵树只有一个结点,它的深度为1

     ②如果根结点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加1;同样如果根结点只有右子树而没有左子树,那么树的深度应该是其右子树的深度加1

     ③如果既有右子树又有左子树,那该树的深度就是其左、右子树深度的较大值再加1

 

      在上图的二叉树中,根结点为1的树有左右两个子树,其左右子树的根结点分别为结点23。根结点为2的左子树的深度为3,而根结点为3的右子树的深度为2,因此根结点为1的树的深度就是4


代码实现:

int TreeDepth(BinaryTreeNode* pRoot)
{
	if (pRoot == NULL)
	{
		return 0;
	}

	int nLeft = TreeDepth(pRoot->m_pLeft);
	int nRight = TreeDepth(pRoot->m_pRight);

	return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}

完整代码及其测试用例实现:

#include<iostream>
using namespace std;

struct BinaryTreeNode
{
	int             m_nValue;
	BinaryTreeNode*        m_pLeft;
	BinaryTreeNode*        m_pRight;
};

BinaryTreeNode* CreateBinaryTreeNode(int value)
{
	BinaryTreeNode* pNode = new BinaryTreeNode();
	pNode->m_nValue = value;
	pNode->m_pLeft = NULL;
	pNode->m_pRight = NULL;

	return pNode;
}

void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
{
	if (pParent != NULL)
	{
		pParent->m_pLeft = pLeft;
		pParent->m_pRight = pRight;
	}
}

void DestroyTree(BinaryTreeNode* pRoot)
{
	if (pRoot != NULL)
	{
		BinaryTreeNode* pLeft = pRoot->m_pLeft;
		BinaryTreeNode* pRight = pRoot->m_pRight;

		delete pRoot;
		pRoot = NULL;

		DestroyTree(pLeft);
		DestroyTree(pRight);
	}
}

int TreeDepth(BinaryTreeNode* pRoot)
{
	if (pRoot == NULL)
	{
		return 0;
	}

	int nLeft = TreeDepth(pRoot->m_pLeft);
	int nRight = TreeDepth(pRoot->m_pRight);

	return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
}

// ====================测试代码====================
void Test(BinaryTreeNode* pRoot, int expected)
{
	int result = TreeDepth(pRoot);

	if (expected == result)
	{
		cout << "Test passed." << endl;
	}
	else
	{
		cout << "Test failed." << endl;
	}
}

void Test1()
{
//            1
//         /      \
//        2        3
//       /\         \
//      4  5         6
//        /
//       7
	cout << "Test1 begin:" ;

	BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
	BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
	BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
	BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
	BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
	BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
	BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);

	ConnectTreeNodes(pNode1, pNode2, pNode3);
	ConnectTreeNodes(pNode2, pNode4, pNode5);
	ConnectTreeNodes(pNode3, NULL, pNode6);
	ConnectTreeNodes(pNode5, pNode7, NULL);

	Test(pNode1, 4);

	DestroyTree(pNode1);
}

void Test2()
{
	//               1
	//              /
	//             2
	//            /
	//           3
	//          /
	//         4
	//        /
	//       5
	cout << "Test2 begin:" ;

	BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
	BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
	BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
	BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
	BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);

	ConnectTreeNodes(pNode1, pNode2, NULL);
	ConnectTreeNodes(pNode2, pNode3, NULL);
	ConnectTreeNodes(pNode3, pNode4, NULL);
	ConnectTreeNodes(pNode4, pNode5, NULL);

	Test(pNode1, 5);

	DestroyTree(pNode1);
}

void Test3()
{
// 1
//  \
//   2
//    \
//     3
//      \
//       4
//        \
//         5
	cout << "Test3 begin:" ;

	BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
	BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
	BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
	BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
	BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);

	ConnectTreeNodes(pNode1, NULL, pNode2);
	ConnectTreeNodes(pNode2, NULL, pNode3);
	ConnectTreeNodes(pNode3, NULL, pNode4);
	ConnectTreeNodes(pNode4, NULL, pNode5);

	Test(pNode1, 5);

	DestroyTree(pNode1);
}

void Test4()
{
	// 树中只有1个结点
	cout << "Test4 begin:" ;

	BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
	Test(pNode1, 1);

	DestroyTree(pNode1);
}

void Test5()
{
	// 树中没有结点
	cout << "Test5 begin:" ;

	Test(NULL, 0);
}

int main()
{
	Test1();
	Test2();
	Test3();
	Test4();
	Test5();

	system("pause");
	return 0;
}


运行结果:

Test1 begin:Test passed.

Test2 begin:Test passed.

Test3 begin:Test passed.

Test4 begin:Test passed.

Test5 begin:Test passed.

请按任意键继续. . .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值