每日一刷——12.10——学习二叉树解题模式(1)

题目一 : 翻转二叉树

题目描述:226. 翻转二叉树 - 力扣(LeetCode)

我的理解:

是不是要储存一下遍历到的节点?然后感觉对于每一个节点的变化都很大,我想可不可以先用一个双端队列储存每层的节点,然后再重新建立一颗树,感觉建立比移动和改变会更方便,只是可能会更加消耗内存,

惹惹惹,大家先不要相信我,好像其实这样很复杂也很慢,确实可以直接交换

我漏掉了一个细节,就是我以为是,拿最后一层举例啊,就是我以为是,不是最右边的换到了最前面嘛,我就以为是一口气移动过去的,哎呀,这样就忽略了一些节点的关联性,找到递归的思想,想一想是不是每一层都做了同样的事,我的思路就感觉还是停留在如何能在我可预见的一个情况下,解决这个问题,导致思路很窄,很局限,没有全局性

题目分析:

=====其实仔细思考一下,每一个节点就和它的旁边交换一下就可以了=======

上面那一点说的也不对,确实是和旁边的交换,但是第一个咋办,那不就不能交换了,而且还有一点就是如何拿到旁边的节点呢,所以我还是没总结对

对的应该是每一个节点把它的两个子节点交换位置!!!!

所以最后就是写一个遍历函数的框架 ,然后把每一个节点的左右子节点进行交换,但是如果是空节点,就返回

自己的思路:

看看以后自己能否把它补完,其实感觉这个方法也不是不行,就是慢了点

java 复制代码
public TreeNode invertTree(TreeNode root) {
        if(root==null)
            return root;
        List<TreeNode> deque =new LinkedList<>();
        List<TreeNode> newdeque =new LinkedList<>();
        //两个队列,一个存,一个取
        TreeNode newRoot =new TreeNode(root.val,root.left,root.right);
        //外层循环干什么-----
        //感觉可以变成一个建树的函数,一个拿到那些点建树,一个拿到那些点建树
        while(){
            int count=deque.size();
            while(count--){
                newdeque.add(deque.pollLast());

            }
        }
    }

题解:

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 invertTree(TreeNode root) {
        traverse(root);
        return root;
    }

    public static void traverse(TreeNode root){
        if(root==null)
            return;

        TreeNode temp;
        temp=root.right;
        root.right =root.left;
        root.left=temp;

        traverse(root.left);
        traverse(root.right);
    }
}

题目二: 二叉树的直径

题目描述: 543. 二叉树的直径 - 力扣(LeetCode)

我的理解:

什么时候取最大??我觉得某个结点的左边深度最大的加上右边深度最大的就是最大的,感觉有点像我下边画的这样的:

所以我有点想模仿当时上一次写那个求最大深度的那个题目

自己的思路:

java 复制代码
class Solution {
    public int diameterOfBinaryTree(TreeNode root) {
        traverse(root);
        
    }

    public static void traverse(TreeNode root){
        if(root ==null){
            return;
            //惹,咋表示左右两边的???
            ans=
        }

        depth++;
        traverse(root.left);
        traverse(root.right);
        depth--;
    }
}

写到这里不知道怎么表示左右两边了哈。。。

!!!!注意这一个注意事项: 配合外部变量 遍历的思维

题目分析:

啊哈!自己的思路终于对了,素的,就是一个结点的左右子树的最大深度之和!!

所以关键就是代码咋写。。

题解:

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 static int MaxDiameter =0;

    public int diameterOfBinaryTree(TreeNode root) {
        MaxDiameter=0;
        traverse(root);
        return MaxDiameter;
    }

    //遍历二叉树
    public static void traverse(TreeNode root){
        if(root ==null){
            return;
            //惹,咋表示左右两边的???
        }

        //对每一个结点计算直径
        int leftMax =maxDepth(root.left);
        int rightMax =maxDepth(root.right);
        int myDiameter =leftMax +rightMax;
        //更新全局最大值
        MaxDiameter =Math.max(MaxDiameter,myDiameter);

        traverse(root.left);
        traverse(root.right);
    }

    //计算二叉树的最大深度
    public static int maxDepth(TreeNode root){
        if(root ==null){
            return 0;
        }

        int leftMax =maxDepth(root.left);
        int rightMax =maxDepth(root.right);

        return 1+Math.max(leftMax,rightMax);
    }

}

其实我感觉自己的把每一个不同的功能分开的能力还不是很强,阿巴,也就是说前序的时候就计算最大值,但是感觉好像进行了两次递归?maxDepth() ,和traverse() 这里好像都用了递归

相关推荐
杰哥技术分享1 分钟前
IDEA 打开文件乱码
java·ide·intellij-idea
猫头虎4 分钟前
[特殊字符]解决 “IDEA 登录失败。不支持早于 14.0 的 GitLab 版本” 问题的几种方法
java·ide·网络协议·http·https·gitlab·intellij-idea
布伦鸽22 分钟前
C# WPF 左右布局实现学习笔记(1)
笔记·学习·c#·wpf
娃哈哈哈哈呀32 分钟前
html-pre标签
java·前端·html
LanLance35 分钟前
ES101系列09 | 运维、监控与性能优化
java·运维·后端·elasticsearch·云原生·性能优化·golang
Java永无止境35 分钟前
Web前端基础:HTML-CSS
java·前端·css·html·javaweb
安全系统学习1 小时前
网络安全逆向分析之rust逆向技巧
前端·算法·安全·web安全·网络安全·中间件
sz66cm1 小时前
LeetCode刷题 -- 542. 01矩阵 基于 DFS 更新优化的多源最短路径实现
leetcode·矩阵·深度优先
clk66071 小时前
Spring Boot
java·spring boot·后端
扣丁梦想家1 小时前
✅ 常用 Java HTTP 客户端汇总及使用示例
java·开发语言·http