求最大深度和最小深度。
最大深度
题目:
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
思路:
1,一个二叉树的深度 = 以根节点为root的子树的深度 = max ( 以root->left为root的子树的深度, 以root->right为root的子树的深度 ) + 1
2,如果一个节点为空,则该节点深度为0,或者说如果一个节点没有左右子树,则该节点深度为1
int TreeDepth(TreeNode* pRoot)
{
if(!pRoot) // 如果到达了空结点,则返回0深度
return 0;
int left = TreeDepth(pRoot->left);
int right = TreeDepth(pRoot->right);
return max(left, right) + 1;
}
最小深度
最小深度简单思考可以认为是最大深度类似问题,即一个树的最小深度等于左右子数的最小深度+1。
稍加修改:
int TreeDepth(TreeNode* pRoot)
{
if(!pRoot) // 如果到达了空结点,则返回0深度
return 0;
int left = TreeDepth(pRoot->left);
int right = TreeDepth(pRoot->right);
return min(left, right) + 1;
}
这么做其实与题意不符。最小深度必须要到达一个叶结点,如果一个结点只有单侧结点,上述方法会直接停止,得到错误的最小深度。见下图:
故需要修改,增加判断当前结点的左右结点是否为空:
(1)若有一个为空,则取另一侧的最小长度+1(而不是之前那样取为空位置的深度)
(2)当左右均不为空时再取两者的最小深度。
int run(TreeNode *root) {
if (!root)
return 0;
if (!root->left)
return run(root->right)+1;
if (!root->right)
return run(root->left)+1;
return min(run(root->left), run(root->right)) + 1;
}