首页 > 其他分享 >2022-8-27 每日一题-层序遍历+标记+剑指offer-字典树+dfs

2022-8-27 每日一题-层序遍历+标记+剑指offer-字典树+dfs

时间:2022-08-27 12:11:16浏览次数:104  
标签:TreeNode dictionary val offer int 层序 dfs 单词 root

662. 二叉树最大宽度

难度中等

给你一棵二叉树的根节点 root ,返回树的 最大宽度 。

树的 最大宽度 是所有层中最大的 宽度 。

每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这些 null 节点也计入长度。

题目数据保证答案将会在  32 位 带符号整数范围内。

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode() {}
 8  *     TreeNode(int val) { this.val = val; }
 9  *     TreeNode(int val, TreeNode left, TreeNode right) {
10  *         this.val = val;
11  *         this.left = left;
12  *         this.right = right;
13  *     }
14  * }
15  */
16 class Solution {
17     public int widthOfBinaryTree(TreeNode root) {
18         Queue<TreeNode> q=new LinkedList<>();
19         root.val=1;
20         q.offer(root);
21         int ans=0;
22         while (!q.isEmpty()){
23             int size=q.size();
24             int l=-1;
25             int r=-1;
26             for (int i=0;i<size;i++){
27                 TreeNode node=q.poll();
28                 if (i==0) l=node.val;
29                 if (i==size-1) r=node.val;
30                 if (node.left!=null){
31                     node.left.val=node.val*2;
32                     q.offer(node.left);
33                 }
34                 if (node.right!=null){
35                     node.right.val=node.val*2+1;
36                     q.offer(node.right);
37                 }
38             }
39             ans=Math.max(ans,r-l+1);
40         }
41         return ans;
42     }
43 }

思路:记录当前节点的位置(个数,左子树就是根的两倍,右子树就是根的两倍多一,层序遍历直接看最前面和最后面的宽度。

 

剑指 Offer II 064. 神奇的字典

难度中等

设计一个使用单词列表进行初始化的数据结构,单词列表中的单词 互不相同 。 如果给出一个单词,请判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于已构建的神奇字典中。

实现 MagicDictionary 类:

  • MagicDictionary() 初始化对象
  • void buildDict(String[] dictionary) 使用字符串数组 dictionary 设定该数据结构,dictionary 中的字符串互不相同
  • bool search(String searchWord) 给定一个字符串 searchWord ,判定能否只将字符串中 一个 字母换成另一个字母,使得所形成的新字符串能够与字典中的任一字符串匹配。如果可以,返回 true ;否则,返回 false 。
 1 class MagicDictionary {
 2     Trie root;
 3     /** Initialize your data structure here. */
 4     public MagicDictionary() {
 5         root=new Trie();
 6     }
 7     
 8     public void buildDict(String[] dictionary) {
 9         for (String s:dictionary){
10             Trie head=root;
11             for (int i=0;i<s.length();i++){
12                 int index=s.charAt(i)-'a';
13                 if (head.children[index]==null){
14                     head.children[index]=new Trie();
15                 }
16                 head=head.children[index];
17             }
18             head.isWord=true;
19         }
20     }
21     
22     public boolean search(String searchWord) {
23         return dfs(searchWord,root,0,false);
24     }
25 
26     public boolean dfs(String word,Trie root,int index,boolean modified){
27         if (index==word.length()) return root.isWord&&modified;
28         int idx=word.charAt(index)-'a';
29         if (root.children[idx]!=null){
30             if (dfs(word,root.children[idx],index+1,modified)){
31                 return true;
32             }
33         }
34         if (!modified){
35             for (int i=0;i<26;i++){
36                 if (i!=idx&&root.children[i]!=null){
37                     if (dfs(word,root.children[i],index+1,true)){
38                         return true;
39                     }
40                 }
41             }
42         }
43         return false;
44     }
45 }
46 
47 class Trie{
48     boolean isWord;
49     Trie[] children;
50     Trie(){
51         isWord=false;
52         children=new Trie[26];
53     }
54 }
55 
56 /**
57  * Your MagicDictionary object will be instantiated and called as such:
58  * MagicDictionary obj = new MagicDictionary();
59  * obj.buildDict(dictionary);
60  * boolean param_2 = obj.search(searchWord);
61  */

思路:字典树记录单词,dfs搜索是否可行。

标签:TreeNode,dictionary,val,offer,int,层序,dfs,单词,root
From: https://www.cnblogs.com/benbicao/p/16630318.html

相关文章

  • 剑指 Offer II 112. 最长递增路径-----记忆化搜索
    题目表述给定一个 mxn整数矩阵 matrix,找出其中最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。不能在对角线方向上移动或移动到边界外(......
  • bfs和dfs基础
    #bfs&dfsgraph={"A":["B","C"],"B":["A","C","D"],"C":["A","B","D","E"],"D":["B","......
  • 【HDFS】一次Namenode的RPC延迟故障排查引发的深入思考
    一次Namenode的RPC延迟故障排查引发的深入思考前言正文问题排查初步定位临时恢复定位可疑进程问题分析问题脚本分析问题原因分析代码分析测试代码prometheus_clien......
  • 2022-8-25 剑指offer-字典树-每日一题-二分/排序
    剑指OfferII063.替换单词难度中等25收藏分享切换为英文接收动态反馈在英语中,有一个叫做 词根(root) 的概念,它可以跟着其他一些词组成另一个较长的单词——我......
  • LCA C 求和 求子树权值和 树上节点单点修改 dfs序+树状数组
     链接:https://ac.nowcoder.com/acm/problem/204871来源:牛客网题目描述已知有 nnn个节点,有 n−1n-1n−1条边,形成一个树的结构。给......
  • 剑指 Offer 10- II. 青蛙跳台阶问题
    一、题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n 级的台阶总共有多少种跳法。答案需要取模1e9+7(1000000007),如计算初始结果为:100000000......
  • 2022-8-24 每日一题-简单模拟-剑指offer-前缀树
    1460.通过翻转子数组使两个数组相等难度简单52收藏分享切换为英文接收动态反馈给你两个长度相同的整数数组 target 和 arr 。每一步中,你可以选择 arr 的任意......
  • 深度优先搜索 DFS
    深度优先搜索dfs概念:从一个点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念就是深度优先。模......
  • dfs总结
    Dfs:深度优先搜索.它是将当前状态按照一定的规则顺序,先拓展一步得到一个新状态,再对这个新状态递归拓展下去。如果无法拓展,则退回一步到上一个状态,再按照原先设定的规则顺......
  • 2022-8-23 剑指offer-优先队列(堆)-每日一题-太难不写了
    剑指OfferII061.和最小的k个数对难度中等44收藏分享切换为英文接收动态反馈给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。定义......