递归法实现,昨天实现了用迭代法求二叉树的最大深度。
本题用递归的话,是要用到后续遍历的思路。也就是求根节点的最大高度。
我们可以先遍历到叶子节点,然后从叶子节点一层一层往上遍历,每遍历一次,将高度高度+1。
但是我们有很多叶子节点,因为求的是最大深度,所以我们需要返回的是最大的高度。所以在+1的时候需要进行一个最值判断,只与最大的+1.具体图解如下:
代码如下:
class Solution {
public:
int digui(TreeNode*root)
{
if(root== NULL) return 0;
int lefthight = digui(root->left);
int righthight = digui(root->right);
int result = 1+max(lefthight,righthight);
return result;
}
int maxDepth(TreeNode* root) {
return digui(root);
}
};
对于这种N叉树,我们可以用层序遍历去求解,也就是广度优先搜索。
和昨天写过的很多层序遍历方法类似。也就是将一层遍历完之后给深度+1.
代码如下:
class Solution {
public:
int maxDepth(Node* root) {
if(root==NULL) return 0;
queue<Node*>que;
que.push(root);
Node*cur = root;
int deep = 0;
while(!que.empty())
{
int size = que.size();
deep++;
while(size--)
{
cur = que.front();
que.pop();
for(int i =0;i<cur->children.size();i++)
{
que.push(cur->children[i]);
}
}
}
return deep;
}
};
递归方法。和求二叉树的最大深度方法类似。求二叉树的最大深度方法是计算一个max,这个就是计算一个min。但是需要考虑到左子树为空,右子树不为空。右子树为空,左子树不为空的情况。
代码如下:
class Solution {
public:
int gethight(TreeNode*root)
{
if(root==NULL) return 0;
int leftdeep = gethight(root->left);
int rightdeep = gethight(root->right);
if(root->left==NULL&&root->right!=NULL) return 1+rightdeep;
if(root->right==NULL&&root->left!=NULL) return 1+leftdeep;
int deep = 1+min(leftdeep,rightdeep);
return deep;
}
int minDepth(TreeNode* root) {
return gethight(root);
}
};
这题可以遍历所有的节点。但是这种方式时间复杂度是o(n)。如果利用完全二叉树的特性的话可以减少复杂度。直接看图:
代码如下:
class Solution {
public:
int digui(TreeNode*root)
{
if(root==NULL) return 0;
TreeNode*left = root->left; TreeNode*right=root->right;
int leftdeep = 0;int rightdeep = 0;
while(left!=NULL)
{
leftdeep++;
left = left->left;
}
while(right!=NULL)
{
rightdeep++;
right = right->right;
}
if(leftdeep==rightdeep) return (2<<leftdeep) - 1;
int getleft = digui(root->left);
int getright = digui(root->right);
return (getleft+getright+1);
}
int countNodes(TreeNode* root) {
return digui(root);
}
};