zoukankan      html  css  js  c++  java
  • 【LeetCode】二叉树的最大深度

    【问题】给定一个二叉树,找出其最大深度。

    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
    说明: 叶子节点是指没有子节点的节点。

    示例:
    给定二叉树 [3,9,20,null,null,15,7],

    3
    / 
    9 20
    / 
    15 7

    返回它的最大深度 3 。

    【DFS解法】

    我们使用栈结构来储存每个节点root以及该节点的深度deep,由于对tuple的使用还不太熟练,需要多练习,一次使用tuple来讲树结构体指针和对应的整型变量深度。从根节点开始遍历,首先一直遍历左子节点,并将节点压入栈中,如果左子节点为空,则从栈中弹出,并开始遍历弹出节点的右子节点。这个过程也就相当于回溯了,回到上一级去。

    **
     * 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 == nullptr)  return 0;
            stack<tuple<TreeNode*, int>> sta;
            int maxdeep = 0;
            int deep = 0;
            while(!sta.empty() || root){
                while(root){
                    sta.push(make_tuple(root, deep+1));
                    deep++;
                    root = root->left;
                }
                tie(root, deep) = sta.top();
                if(maxdeep < deep) maxdeep = deep;
                sta.pop();
                root = root->right;
            }
            return maxdeep;
        }
    };

    【BFS解法】

    这个其实质就是层次遍历,使用队列来储存树节点,并使用size变量记录每次节点的数量,在一次循环中,处理掉一层的节点,具体做法:将某一层所有节点的子节点压入队列后,并将所有的节点移除队列。
    在处理某一层的树节点的同时,使用count变量记录处理的层数。即为最大深度!

    /**
     * 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 == nullptr){
                return 0;
            }
            queue<TreeNode*> que;
            que.push(root);
            int count = 0;
            while(que.size() != 0){
                int size = que.size();
    
                while(size--){
                    TreeNode* tmp = que.front();
                    if(tmp->left != nullptr) que.push(tmp->left);
                    if(tmp->right != nullptr) que.push(tmp->right);
                    que.pop();
                }
                count++;
            }
            return count;
        }
    };
  • 相关阅读:
    sprintf函数%u输入long long int型数值异常
    关于smarty模板display函数的$compile_id 参数的意义
    打log的时候如果少写一个%d,cgi会core掉
    c++标准库的源码和SIG实现是什么关系
    2010
    jquery 中jsonp原理最简说明
    1月17日stl string阅读笔记
    Moss母版页制作详解(一)
    Moss中的权限操作
    动态添加和删除表格行
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11644772.html
Copyright © 2011-2022 走看看