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

相关推荐
C++oj几秒前
普及组集训--图论最短路径设分层图
数据结构·算法·图论·最短路径算法
小参宿4 分钟前
【Stream流】
java·开发语言
In 20296 分钟前
图论【Lecode_HOT100】
算法·图论
ruleslol9 分钟前
java基础概念49-数据结构2
java·数据结构
qq_106138345711 分钟前
快速搭建SpringBoot3+Vue3+ElementPlus管理系统
java·vue.js·spring boot·idea
荒古前17 分钟前
小发现,如何高级的顺序输出,逆序输出整数的每一位(栈,队列)
数据结构·c++·算法
Koikoi12323 分钟前
java引用相关(四大引用类型,软引用避免oom,弱引用表,虚引用和引用队列,可达性分析算法)
java·开发语言
Y编程小白24 分钟前
Leetcode经典题7--跳跃游戏
算法·leetcode·游戏
GoodStudyAndDayDayUp30 分钟前
一个老是用的SQL
java·数据库·sql
奶香臭豆腐32 分钟前
C++ 泛编程 —— 函数模板(中)
开发语言·c++·学习