104.[二叉树最大深度] Maximum Depth of Binary Tree

帽子zhzhC++dadasort> 最基础的二叉树遍历的问题,求最大深度。


Given a binary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.

二叉树都忘了,有点淡淡的忧桑

从这道题开始就初涉图论的内容了,最基本的二叉树,又是最基本的遍历。但是想一想,若是没有这道题,我还永远忘了呢!待我想起遍历大法,看二叉树尸横遍野吧。
二叉树基础包括深度优先搜索、广度优先搜索,最大/最小深度,最大/最小广度,涉及递归。初步感觉对于二叉树掌握这几个就基本够了。

递归,好久不见

每逢我看到递归,都有点望而生畏。但至少就这道题来说,即使自己脑容量的内存和CPU不够,不能跟着递归深思熟虑,但递归确实是最容易用“第六感”去解决问题的办法。“反正我解决不了的让我的孩子去解决”,我想这就是递归的精髓吧~

用递归求二叉树最大深度

请看带注释的代码(今天因为注释详细被夸了@-@)
2016-07-18 00:04:10

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        //求二叉树最大深度,递归解法
        if(!root) return 0; //0的情况,到叶子节点了。
        
        int leftdepth = maxDepth(root -> left) + 1;//左侧来源的深度
        int rightdepth = maxDepth(root -> right) + 1;//右侧来源的深度
        
        return max(leftdepth,rightdepth);//返回该节点左右最大值
    }
};

运行时间8ms。似乎还有更快的办法。

神奇的栈,非递归方法

当年学过数据结构,也还给老师很多了。欠缺砸实。

栈,我就没擅用过

“采用二叉树的后序遍历非递归算法。由于后序遍历非递归算法使用一个栈实现,每次都会在一条路径上走到最底层才向上访问,再向右访问。因此,记录下栈在遍历中的最大值,即为二叉树的最大深度。”

先贴一段博客园的代码学习学习:

#include <iostream>
#include <stack>
using namespace std;
typedef struct BinTree
{
    int data;
    BinTree *lc;
    BinTree *rc;
}BTNode,*BinTree;
int max(int a,int b)
{
    return (a>b)?a:b;
}

int BinTreeDepth(BinTree T)
{
    stack<BinTree> s;
    BinTree p = T,r = NULL;
    int depth=0;
    while(p||!s.empty())
    {
        if(p)
        {    //从根节点向左边走
            s.push(p);
            int size = s.size();//获取栈的大小
            depth = max(depth,size);//替换最大值
            p = p->lc;
        }
        else
        {    //左边走不通向右走
            p = s.top();
            if(p->rc&&p->rc!=r)//如果右子树存在,且未被访问过
            {
                p = p->rc;
                s.push(p);
                int size = s.size();//获取栈的大小
                depth = max(depth,size);//替换最大值
                p = p->lc;
            }else
            {
                p=s.top();
                s.pop();
                cout<<p->data<<endl;
                r=p;            //记录最近访问的节点
                p=NULL;            //节点访问完之后,重置p指针,目的是为了防止再次将左孩子压栈
            }
        }
    }
    return depth;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一直以来,我都很少使用也避免使用到树和图,总觉得它们神秘而又复杂,但是树在一些运算和查找中也不可避免的要使用到,那...
    24K男阅读 6,784评论 5 14
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,503评论 1 31
  • 二叉树的定义#### 二叉树是n(n>=0)个具有相同类型的元素的有限集合,当n=0时称为空二叉树,当n>0时,数...
    kylinxiang阅读 1,456评论 0 2
  • 1.什么是二叉树? 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”,...
    zcaaron阅读 1,296评论 2 15
  • 去年二叉树算法的事情闹的沸沸扬扬,起因是Homebrew 的作者 @Max Howell 在 twitter 上发...
    Masazumi柒阅读 1,629评论 0 8