二叉树的最大深度,即为二叉树的层数,开始的想法是遍历左子树和遍历右子树,返回记录的最大值。这样明显是有漏洞的,如果最右的右子树有左孩子或者左子树有右孩子,结果就是不正确的。
使用递归的方法,整树的最大深度为左孩子树的最大深度或者右孩子树的最大深度。递归结束的条件是,当一个结点的左右子树都为空时,返回1结束。核心思想是DFS深度优先遍历算法。
文章目录
#include
using namespace std;
class Solution {
public:
int maxDepth(TreeNode* root) {
if(!root)return 0;
if(root->left==NULL && root->right==NULL)return 1;
int ans=1; //第一层根结点
ans+=max(maxDepth(root->left),maxDepth(root->right));
return ans;
}
};
更加简洁的代码:
文章目录
#include
using namespace std;
class Solution {
public:
int maxDepth(TreeNode* root) {
if(!root)return 0;
int l=maxDepth(root->left)+1;
int r=maxDepth(root->right)+1;
return l>r?l:r;
}
};
深度优先搜索迭代方法,二叉树的中序遍历,始终寻找左子树,到头后在寻找右子树。使用栈,优先遍历左子树,遍历当NULL时,右拐遍历右子树,记录右拐时的结点信息。
文章目录
#include
#include
using namespace std;
class Solution {
public:
int maxDepth(TreeNode* root) {
if(!root) return 0;
int deep(0),maxdepth(0);
TreeNode* p=root;
stack<pair<TreeNode*,int>>s;
while(!s.empty() || p!=NULL) //只要栈不为空 就说明还有结点的右子树没有遍历 若p非空 则说明还有结点的左子树没有遍历
{
while(p) //优先向左遍历
{
s.push(pair<TreeNode*,int>(p,++deep));
p=p->left;//优先向左遍历
}
p=s.top().first;//若左边遍历到头,准备右拐。右拐之前,记录右拐点的基本信息
deep=s.top().second;
maxdepth=max(deep,maxdepth);
s.pop();
p=p->right;
}
return maxdepth;
}
};
广度优先遍历,实际实现就是二叉树的层序遍历。使用队列。每一次循队列中的元素是每一层的所有元素,内层for循环即判断某一层所有结点有没有左右子树,如果有则尾插入队列。for循环的结束条件是某一层结点的个数,不能在for循环中图简单直接写i<=q.size(),因为在for循环语句中,有元素出队列,所以q.size()时刻变化。此处i的含义是每一层的结点个数,无所谓下标,所以从1开始好理解。
文章目录
#include
#include
using namespace std;
class Solution {
public:
int maxDepth(TreeNode* root) {
if(!root) return 0;
int deep(0);
deque<TreeNode*> q;
q.push_back(root);
while(!q.empty())
{
++deep;
for(int i=1;i<q.size();i++)
{
TreeNode* p=q.front();
q.pop_front();
if(p->left) q.push_back(p->left);
if(p->right) q.push_back(p->right);
}
}
return deep;
}
};