zoukankan      html  css  js  c++  java
  • LeetCode 104. 二叉树的最大深度(C#实现)——二叉树,BFS,DFS,递归,迭代

    一、问题
    https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

    给定一个二叉树,找出其最大深度。
    
    二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
    
    说明: 叶子节点是指没有子节点的节点。
    
    示例:
    给定二叉树 [3,9,20,null,null,15,7],
    
        3
       / 
      9  20
        /  
       15   7
    
    返回它的最大深度 3

    二、GitHub实现:https://github.com/JonathanZxxxx/LeetCode/blob/master/MaxDepthClass.cs

      Blog:https://www.cnblogs.com/zxxxx/

    三、思路

      1、深度优先搜索,递归:对左右孩子进行DFS递归,得出最大值

      2、深度优先搜索,迭代:获取最深的节点深度。根节点和当前节点深度1入栈,每次迭代中,获取并移除栈顶元素,比较当前节点深度和当前深度,取最大值,当前节点右孩子不为空的话,将右孩子和当前节点深度加一入栈,左孩子同理

      3、广度优先搜索,迭代:记录二叉树的层数。根节点入队列,每次迭代,当前深度加一,循环当前队列长度,每次循环,获取并移队列顶元素,当前节点左孩子不为空,入队列,右孩子同理

    四、代码实现

        public class MaxDepthClass
        {
            public class TreeNode
            {
                public int val;
                public TreeNode left;
                public TreeNode right;
                public TreeNode(int x) { val = x; }
            }
    
            /// <summary>
            /// 深度优先搜索,递归
            /// </summary>
            /// <param name="root"></param>
            /// <returns></returns>
            public int MaxDepth(TreeNode root)
            {
                if (root == null) return 0;
                var left = MaxDepth(root.left);
                var right = MaxDepth(root.right);
                return Math.Max(left, right) + 1;
            }
    
            /// <summary>
            /// 广度优先搜索,迭代
            /// </summary>
            /// <param name="root"></param>
            /// <returns></returns>
            public int MaxDepthBFS(TreeNode root)
            {
                if (root == null) return 0;
                var queue = new Queue<TreeNode>();
                queue.Enqueue(root);
                var count = 0;
                while (queue.Any())
                {
                    count++;
                    var length = queue.Count;
                    for (int i = 0; i < length; i++)
                    {
                        var current = queue.Dequeue();
                        if (current.left != null) queue.Enqueue(current.left);
                        if (current.right != null) queue.Enqueue(current.right);
                    }
                }
                return count;
            }
    
            /// <summary>
            /// 深度优先搜索,迭代
            /// </summary>
            /// <param name="root"></param>
            /// <returns></returns>
            public int MaxDepthDFS(TreeNode root)
            {
                if (root == null) return 0;
                var stack = new Stack<Tuple<TreeNode, int>>();
                var depth = 0;
                stack.Push(new Tuple<TreeNode, int>(root, 1));
                while (stack.Any())
                {
                    var current = stack.Pop();
                    depth = Math.Max(depth, current.Item2);
                    if (current.Item1.right != null) stack.Push(new Tuple<TreeNode, int>(current.Item1.right, current.Item2 + 1));
                    if (current.Item1.left != null) stack.Push(new Tuple<TreeNode, int>(current.Item1.left, current.Item2 + 1));
                }
                return depth;
            }
        }
  • 相关阅读:
    解决“Kali Linux终端打不开”
    国内网站备案。备案的是域名?还是服务器?
    Linux磁盘分区
    Linux各目录的作用
    vim基础操作
    基础算法-->堆排序
    期望,方差,标准差,正态分布
    平面向量
    基础算法 ---> 二分法
    学习人工智能准备了解的算法
  • 原文地址:https://www.cnblogs.com/zxxxx/p/12157289.html
Copyright © 2011-2022 走看看