力扣-数据结构-8【算法学习day.79】

前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!

今天开始复习树,简单的题目不会具体分析


习题

1.二叉树的前序遍历

题目链接: 144. 二叉树的前序遍历 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> ans = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        recursion(root);
        return ans;
    }
    public void recursion(TreeNode node){
        if(node==null)return;
        ans.add(node.val);
        recursion(node.left);
        recursion(node.right);
    }
}

2. 叶子相似的树

题目链接: 872. 叶子相似的树 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> list1 = new ArrayList<>();
    List<Integer> list2 = new ArrayList<>();
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        recursion(root1,1);
        recursion(root2,2);
        if(list1.size()!=list2.size())return false;
        for(int i = 0;i<list1.size();i++){
            if(!list1.get(i).equals(list2.get(i)))return false;
        }
        return true;
    }
    public void recursion(TreeNode node,int flag){
        if(node==null)return;
        if(node.left==null&&node.right==null){
            if(flag==1){
                 list1.add(node.val);
            }else{
                 list2.add(node.val);
            }
            return;
        }
        recursion(node.left,flag);
        recursion(node.right,flag);
    }
}

3.开幕式焰火

题目链接: LCP 44. 开幕式焰火 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    Map<Integer,Integer> map = new HashMap<>();
    int ans = 0;
    public int numColor(TreeNode root) {
        recursion(root);
        return ans;
    }
    public void recursion(TreeNode node){
        if(node==null)return;
        recursion(node.left);
        recursion(node.right);
        if(map.getOrDefault(node.val,-1)==-1){
            ans++;
            map.merge(node.val,1,Integer::sum);
        }
    }
}

4.二叉树中第二小的节点

题目链接: 671. 二叉树中第二小的节点 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int[] arr= new int[30];
    int count = 0;
    public int findSecondMinimumValue(TreeNode root) {
       recursion(root);
       Arrays.sort(arr);
       int index = 0;
       while(arr[index]==0)index++;
       int first = arr[index];
    //    System.out.println(first);
       while(index<=29&&arr[index]==first)index++;
       return index==30?-1:arr[index];
    }
    public void recursion(TreeNode node){
        if(node==null)return;
        arr[count++] = node.val;
        recursion(node.left);
        recursion(node.right);
    }
}

5.求根节点到叶子节点数字之和

题目链接: 129. 求根节点到叶节点数字之和 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int ans = 0;
    public int sumNumbers(TreeNode root) {
        recursion(root,0);
        return ans;
    }
    public void recursion(TreeNode node,int val){
        if(node==null)return;
        val=val*10+node.val;
        if(node.left==null&&node.right==null){
            ans+=val;
            return;
        }
        recursion(node.left,val);
        recursion(node.right,val);
    }
}

6.统计二叉树中好节点的数目

题目链接: 1448. 统计二叉树中好节点的数目 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int ans =0;
    public int goodNodes(TreeNode root) {
        recursion(root,Integer.MIN_VALUE);
        return ans;
    }

    public void recursion(TreeNode node,int max){
        if(node==null)return;
        if(node.val>=max){
            // System.out.println(node.val);
            ans++;
            max = node.val;
        }
        recursion(node.left,max);
        recursion(node.right,max);
    }
}

7.二叉树中的伪回文路径

题目链接: 1457. 二叉树中的伪回文路径 - 力扣(LeetCode)

题面:

**分析:**由于节点的值从1到9,所以可以用一个数组存遍历到的数的个数,遍历到尾节点的时候遍历数组,如果数组中奇数次数的个数超过1个,就无法构成回文

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int ans = 0;
    public int pseudoPalindromicPaths (TreeNode root) {
        int[] arr = new int[10];
        recursion(root,arr);
        return ans;
    }
    public void recursion(TreeNode node, int[] arr){
        if(node==null)return;
        arr[node.val]++;
        if(node.left==null&&node.right==null){
            int count = 0;
            for(int a:arr){
                if(a%2==1)count++;
            }
            if(count<=1)ans++;
            arr[node.val]--;
            return;
        }
        recursion(node.left,arr);
        recursion(node.right,arr);
        arr[node.val]--;
    }
}

8.祖父节点值为偶数的节点和

题目链接: 1315. 祖父节点值为偶数的节点和 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int ans = 0;
    public int sumEvenGrandparent(TreeNode root) {
        recursion(root,-1,-1);
        return ans;
    }
    public void recursion(TreeNode node,int par,int gpar){
        if(node==null)return;
        if(gpar!=-1&&gpar%2==0){
            ans+=node.val;
        }
        recursion(node.left,node.val,par);
        recursion(node.right,node.val,par);
    }
}

9.从叶节点开始的最小字符串

题目链接: 988. 从叶结点开始的最小字符串 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    String ans = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
    public String smallestFromLeaf(TreeNode root) {
        recursion(root,"");
        return new StringBuilder().append(ans).reverse().toString();
    }
    public void recursion(TreeNode node,String str){
        if(node==null)return;
        int flag = 'a'+node.val;
        str+=(char)flag;
        if(node.left==null&&node.right==null){
            ans = compareToString(str,ans)?ans:str;
            return;

        }
        recursion(node.left,str);
        recursion(node.right,str);
    }
    public Boolean compareToString(String str1,String str2){
        char[] arr1 = str1.toCharArray();
        char[] arr2 = str2.toCharArray();
        int l1 = arr1.length-1;
        int l2 = arr2.length-1;
        while(l1>=0&&l2>=0){
            if(arr1[l1]>arr2[l2]){
                return true;
            }else if(arr1[l1]<arr2[l2]){
                return false;
            }
            l1--;
            l2--;
        }
        return l1==-1?false:true;
    }
}

10.节点与其祖先之间的最大差值

题目链接: 1026. 节点与其祖先之间的最大差值 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int ans = 0;
    public int maxAncestorDiff(TreeNode root) {
        recursion(root,Integer.MAX_VALUE,Integer.MIN_VALUE);
        return ans;
    }
    public void recursion(TreeNode node,int min,int max){
        if(node==null)return;
        if(min!=Integer.MAX_VALUE){
            ans = Math.max(ans,Math.abs(min-node.val));
        }
        if(max!=Integer.MIN_VALUE){
            ans = Math.max(ans,Math.abs(max-node.val));
        }
        recursion(node.left,Math.min(min,node.val),Math.max(max,node.val));
        recursion(node.right,Math.min(min,node.val),Math.max(max,node.val));
    }
}

11.从根到叶的二进制数之和

题目链接: 1022. 从根到叶的二进制数之和 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int ans = 0;
    public int sumRootToLeaf(TreeNode root) {
        recursion(root,0);
        return ans;
    }
    public void recursion(TreeNode node,int sum){
        if(node==null)return;
        sum = (sum<<1)+node.val;
        // System.out.println(sum);
        if(node.left==null&&node.right==null){
            ans+=sum;
            return;
        }
        recursion(node.left,sum);
        recursion(node.right,sum);
    }
}

12.在二叉树中增加一行

题目链接: 623. 在二叉树中增加一行 - 力扣(LeetCode)

题面:

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode addOneRow(TreeNode root, int val, int depth) {
        if(depth==1){
            TreeNode node = new TreeNode(val);
            node.left  = root;
            return node;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        int indexdepth = 2;
        queue.offer(root);
        Queue<TreeNode> queue2 = new LinkedList<>();
        while(indexdepth<depth){
           while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            if(node.left!=null){
                queue2.offer(node.left);
            }
            if(node.right!=null){
                queue2.offer(node.right);
            }
           }
           queue = queue2;
           queue2 = new LinkedList<>();
            indexdepth++;
        }

        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            TreeNode left = node.left;
            TreeNode right = node.right;
            node.left = new TreeNode(val);
            node.right = new TreeNode(val);
            node.left.left = left;
            node.right.right = right;
        }
        return root;

    }
}

后言

上面是数据结构相关的习题,下一篇文章会将其他相关的习题。

相关推荐
robin_suli2 分钟前
动态规划回文串问题系列一>回文子串
算法·动态规划
Rk..8 分钟前
数据库索引相关总结
java·数据库·sql
后端转全栈_小伵9 分钟前
深入解析 JDK Lock:为什么必须在同一线程加锁和解锁?
java·后端··lock
菠菠萝宝14 分钟前
【Go学习】-01-4-项目管理及协程
数据库·学习·golang·操作系统·软件工程·协程·os
dgwxligg17 分钟前
C# 中 `new` 关键字的用法
java·前端·c#
老马啸西风20 分钟前
NLP 中文拼写检测纠正论文-08-Combining ResNet and Transformer
java
泰山小张只吃荷园32 分钟前
SCAU软件体系结构期末复习-名词解释题
java·开发语言·后端·学习·spring·面试
观测云38 分钟前
日志聚类算法 Drain 的实践与改良
算法·聚类·日志
心软且酷丶40 分钟前
leetcode:面试题 17.01. 不用加号的加法(python3解法)
python·算法·leetcode
技术很渣43 分钟前
Java工程师实现视频文件上传minio文件系统存储及网页实现分批加载视频播放
java·音视频