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

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搜索是否可行。

posted on 2022-08-27 12:04  阿ming  阅读(17)  评论(0编辑  收藏  举报

导航