每日一刷——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() 这里好像都用了递归

相关推荐
eternal__day18 分钟前
Spring Boot 快速入手
java·spring boot·后端·spring·java-ee·maven
爱的叹息31 分钟前
Spring Boot中事务状态(TransactionStatus)的核心信息及常见应用场景
java·spring boot·后端
杉之1 小时前
Java中的不可变集合
java·笔记·学习
舔甜歌姬的EGUMI LEGACY1 小时前
【算法day28】解数独——编写一个程序,通过填充空格来解决数独问题
算法
潘多编程1 小时前
Gradle实战指南:从入门到进阶,与Maven的深度对比
java·maven
故城、1 小时前
MQ中的RabbitMQ
java·mq
welkin1 小时前
KMP 个人理解
前端·算法
橘猫云计算机设计1 小时前
基于JavaWeb的二手图书交易系统(源码+lw+部署文档+讲解),源码可白嫖!
java·开发语言·前端·毕业设计·php
猿java1 小时前
程序员,你使用过灰度发布吗?
java·分布式·后端