Leetcode二叉树最大深度

  二叉树的最大深度,即为二叉树的层数,开始的想法是遍历左子树和遍历右子树,返回记录的最大值。这样明显是有漏洞的,如果最右的右子树有左孩子或者左子树有右孩子,结果就是不正确的。
  使用递归的方法,整树的最大深度为左孩子树的最大深度或者右孩子树的最大深度。递归结束的条件是,当一个结点的左右子树都为空时,返回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>s;

            while(!s.empty() || p!=NULL) //只要栈不为空 就说明还有结点的右子树没有遍历 若p非空 则说明还有结点的左子树没有遍历
            {
                
                while(p) //优先向左遍历
                {
                    s.push(pair(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 q;
q.push_back(root);
while(!q.empty())
{
++deep;
for(int i=1;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;
}
};

你可能感兴趣的:(Leetcode二叉树最大深度)