• 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;
            }
        }
  • 相关阅读:
    software 的魅力
    CSS中,脚本不能覆盖CSS的!!!
    取消自增ID.
    [求教]FF与IE 的Style 不兼容问题?
    SQL存储过程 之 sp_MSforeachtable和sp_MSforeachDB
    疑问:AddWebPart 不能添加动态加载的自定义控件吗?
    关于 各语言的 readonly。
    查询存储过程中的结果集.(顺便贴:一行折多行的方法)
    附一张css hack
    远程桌面dos开启
  • 原文地址:https://www.cnblogs.com/zxxxx/p/12157289.html
Copyright © 2020-2023  润新知