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

相关推荐
JovaZou13 分钟前
[Python学习日记-75] 计算机基础与网络
开发语言·网络·python·网络协议·学习·tcp/ip·计算机网络
KeyPan1 小时前
【Ubuntu与Linux操作系统:十、C/C++编程】
linux·运维·服务器·c语言·c++·算法·ubuntu
五行星辰3 小时前
Servlet与JSP:Java的秘密花园入口
java·开发语言·servlet
Ckyeka3 小时前
Leetcode刷题笔记—栈与队列
数据结构·python·算法·leetcode
扶离_flee3 小时前
麦田物语学习笔记:背包物品选择高亮显示和动画
笔记·学习
Q_27437851093 小时前
django基于 Python 的考研学习系统的设计与实现
java·python·考研·django
大丈夫立于天地间3 小时前
OSPF - 特殊报文与ospf的机制
网络·网络协议·学习·算法·智能路由器·信息与通信
幸运小圣3 小时前
LeetCode热题100-合并两个有序链表【JavaScript讲解】
javascript·leetcode·链表
夏末秋也凉3 小时前
力扣-数组-219 存在重复元素Ⅱ
算法·leetcode
Wang's Blog3 小时前
数据结构与算法之二叉树: LeetCode 543. 二叉树的直径 (Ts版)
算法·leetcode