IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode刷题——二叉树的右视图#199#Medium -> 正文阅读

[数据结构与算法]LeetCode刷题——二叉树的右视图#199#Medium

二叉树的右视图的思路探讨与源码
????二叉树的右视图的题目如下图,该题属于树和搜索类型的题目,主要考察对于遍历搜索方法的使用和树结构本身的理解。本文的题目作者想到2种方法,分别是BFS广度优先搜索方法和DFS深度优先搜索方法,其中BFS广度优先搜索方法使用Java进行编写,而DFS深度优先搜索方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
????本人认为该题目可以使用BFS广度优先搜索方法的思路进行解决,首先初始化最大深度的参数,并且构造一个右视图的Map去保存信息,同时初始化两个队列,一个是存放树节点元素的队列、另一个是保留深度的队列,再把根节点和初始深度0作为值插入到两个队列里面。然后开始循环遍历,首先将两个队列的第一个元素分别弹出,判断节点是否不为空,如果是就比较最大深度值和当前深度值,取更大的那个作为最大深度值,然后将节点的深度信息和节点一起存入右视图的Map里面,再把节点队列尾部分别填充左子节点右又子节点;把深度队列尾部分别填充左子节点和右子节点的深度值,最终直至遍历结束。最后通过循环,获取所有深度值小于最大值的节点,并插入到列表里返回,就是得到了最终的右视图结果。那么按照这个思路我们的Java代码如下:

#喷火龙与水箭龟
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        int depthMax = -1;
        Map<Integer,Integer> rightResMap = new HashMap<Integer, Integer>();
        Queue<Integer> queueArr = new LinkedList<Integer>();
        Queue<TreeNode> queueTree = new LinkedList<TreeNode>();
        queueArr.add(0);
        queueTree.add(root);

        while (! queueTree.isEmpty()) {
            int depthNum = queueArr.remove();
            TreeNode vertex = queueTree.remove();
            if (vertex != null) {
                depthMax = Math.max(depthNum,depthMax);
                rightResMap.put(depthNum,vertex.val);                
                
                queueTree.offer(vertex.left);
                queueTree.offer(vertex.right);
                queueArr.offer(depthNum + 1);
                queueArr.offer(depthNum + 1);
            }
        }

        List<Integer> resList = new ArrayList<Integer>();
        for (int jr = 0; jr <= depthMax; jr++) {
            resList.add(rightResMap.get(jr));
        }

        return resList;
    }
}

在这里插入图片描述
????显然,我们看到BFS广度优先搜索的方法效果还可以,同时还可以使用DFS深度优先搜索方法解决。首先初始化一个最大深度参数和深度字典,并将根节点和它的深度0作为初始值加入到列表里。然后开始遍历这个列表,将列表的元素抛出,如果节点不为空就开始比较最大深度值和当前深度值,再把当前深度值和树节点分别作为KEY和VALUE保存到深度字典里面。并且再列表尾部分别插入左子节点和它的深度以及右子节点和它的深度信息,直到最终遍历结束。然后循环遍历,将不超过最大深度里面的深度字典的值保存到结果列表里,最终返回结果列表即可。所以按照这个思路就可以解决,下面是Python代码:

#喷火龙与水箭龟
class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        depthMax=-999
        dictDepth={}
        listTree=[(root,0)]
        while listTree:
            vertex,depthNum=listTree.pop()
            if vertex is not None:
                depthMax=max(depthNum,depthMax)
                dictDepth.setdefault(depthNum,vertex.val)
                listTree.append((vertex.left,depthNum+1))
                listTree.append((vertex.right,depthNum+1))
        resList=[]
        for jr in range(depthMax+1):
            resList.append(dictDepth[jr])
        return resList

在这里插入图片描述
????从结果来说Java版本的BFS广度优先搜索方法的效率还可以,而Python版本的DFS深度优先搜索方法的速度也还不错,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:22:01  更:2022-03-06 13:24:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 4:29:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码