首页 > 其他分享 >[刷题记录Day15]Leetcode二叉树

[刷题记录Day15]Leetcode二叉树

时间:2023-08-25 23:45:21浏览次数:56  
标签:遍历 TreeNode cur queue Day15 add 二叉树 root Leetcode

No.1

题目

二叉树的层序遍历

思路

  • 使用队列
  • 关键点:1. 每进入一层,层内的节点都被处理完成 2. 开始遍历层内的节点前,必须先记录该层的节点数量,不能访问到下一层的节点

代码

public List<List<Integer>> levelOrder(TreeNode root) {  
    Queue<TreeNode> queue = new LinkedList<>();  
    queue.add(root);  
    List<List<Integer>> result = new ArrayList<>();  
  
    if (root == null)  
        return result;  
  
    // 外循环,遍历每一层  
    while (queue.size() > 0) {  
        List<Integer> list = new ArrayList<>();  
        // 内循环,遍历每一层的节点  
        int levelNum = queue.size();  
        for (int i = 0; i < levelNum; i++) {  
            TreeNode cur = queue.poll();  
            list.add(cur.val);  
            if (cur.left != null)  
                queue.add(cur.left);  
            if (cur.right != null)  
                queue.add(cur.right);  
        }  
        result.add(list);  
    }  
  
    return result;  
}

No.2

题目

翻转二叉树

思路

  • 递归
  • 这道题目使用前序遍历和后序遍历都可以,唯独中序遍历不方便,因为中序遍历会把某些节点的左右孩子翻转了两次!建议拿纸画一画,就理解了

代码

public void invert(TreeNode node) {  
    if (node == null)  
        return;  
  
    invert(node.left);  
    invert(node.right);  
  
    TreeNode temp = node.left;  
    node.left = node.right;  
    node.right = temp;  
}  
  
public TreeNode invertTree(TreeNode root) {  
    invert(root);  
  
    return root;  
}

No.3

题目

对称二叉树

非递归思路

  • 非递归写法,用队列
  • 每一层,左右指针向中间靠拢,检查对称性
  • 利用越界数据表示异常

非递归代码

public boolean isSymmetric(TreeNode root) {  
    Queue<TreeNode> queue = new LinkedList<>();  
    queue.add(root);  
  
    // 遍历层  
    while (queue.size() > 0) {  
        int nodeNum = queue.size();  
  
        if (queue.peek() != root && queue.size() % 2 != 0)  
            return false;  
  
        // 存储这一层的节点  
        int[] level = new int[nodeNum];  
        // 遍历每一层的节点  
        for (int i = 0; i < nodeNum; i++) {  
            TreeNode cur = queue.poll();  
            if (cur != null) {  
                level[i] = cur.val;  
                queue.add(cur.left);  
                queue.add(cur.right);  
            } else  
                level[i] = 101; // 用越界数据表示异常,-100 <= Node.val <= 100  
        }  
  
        int left = 0, right = nodeNum - 1;  
        while (left < right) {  
            if (level[left] != level[right])  
                return false;  
            left++;  
            right--;  
        }  
    }  
  
    return true;  
}

递归

递归法

标签:遍历,TreeNode,cur,queue,Day15,add,二叉树,root,Leetcode
From: https://www.cnblogs.com/tomatoQt/p/17658211.html

相关文章

  • [刷题记录Day17]Leetcode二叉树
    No.1题目平衡二叉树思路递归法在遍历中比较左右子树的高度差递归分析参数:当前传入节点。返回值:以当前传入节点为根节点的树的高度那么如何标记左右子树是否差值大于1呢?可以返回-1来标记已经不符合平衡树的规则了明确终止条件:递归的过程中依然是遇到空节点了为终止,返......
  • [刷题记录Day16]Leetcode二叉树
    No.1题目二叉树的最大深度思路递归其实是后序遍历的方式代码publicintmaxDepth(TreeNoderoot){if(root==null)return0;returnMath.max(1+maxDepth(root.left),1+maxDepth(root.right));}No.2题目二叉树的最小深度思路......
  • [刷题记录Day18]Leetcode二叉树
    No.1题目找树左下角的值思路队列,层序遍历Deque既可以用作栈也可以用作队列,谨慎使用代码publicintfindBottomLeftValue(TreeNoderoot){Queue<TreeNode>queue=newLinkedList<>();queue.add(root);intresult=0;//记录最后一行第一个元素......
  • [刷题记录Day11]Leetcode
    No.1题目有效的括号思路奇数个符号一定不符合分析括号不匹配的可能性第一种情况,字符串里左方向的括号多余了,所以不匹配![[brackets0.png]]第二种情况,括号没有多余,但是括号的类型没有匹配上![[brackets1.png]]第三种情况,字符串里右方向的括号多余了,所以不匹配![[brac......
  • [刷题记录Day10]Leetcode
    No.1题目用栈实现队列思路模拟一个入栈一个出栈代码classMyQueue{privateStack<Integer>stackIn;privateStack<Integer>stackOut;publicMyQueue(){stackIn=newStack<>();stackOut=newStack<>();......
  • [刷题记录Day13]Leetcode
    No.1题目滑动窗口最大值思路编写单调队列类讲解代码classMonoQue{Deque<Integer>deque=newLinkedList<>();//弹出元素时,比较当前要弹出的值是否等于队列出口的值,相等则弹出//同时判断队列此时是否为空voidpoll(intval){......
  • [刷题记录Day8]Leetcode
    No.1题目反转字符串思路双指针,从头尾向中间遍历代码publicvoidreverseString(char[]s){ chartemp; intleft=0,right=s.length-1; while(left<right){ temp=s[left]; s[left]=s[right]; s[right]=temp; left++; right--; }}No.2......
  • [刷题记录Day9]Leetcode
    建议跳过No.1题目找出字符串中第一个匹配项的下标思路KMP代码No.2题目重复的子字符串思路KMP代码......
  • [刷题记录Day6]Leetcode哈希表
    No.1题目有效的字母异位词思路每个字符频率都相同,于是把字母表映射到长度为26的数组上代码publicbooleanisAnagram(Strings,Stringt){intlenS=s.length(),lenT=t.length();if(lenT!=lenS)returnfalse;int[]alphabet=newint[26]......
  • [刷题记录Day7]Leetcode哈希表
    No.1题目四数相加II思路很妙的办法:有四个数组A、B、C、D,用hashMap记录【A、B中数字之和】+【这些和出现的次数】,再遍历C、D中数字组合,寻找【0-C、D中数字之和】在hashMap中出现的次数,并累加本质上,这是把4个数组简化成了2个数组代码publicintfourSumCount(int[]nums1,......