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

[刷题记录Day17]Leetcode二叉树

时间:2023-08-25 23:44:51浏览次数:52  
标签:node nodePath 递归 Leetcode Day17 二叉树 null 节点 left

No.1

题目

平衡二叉树

思路

  • 递归法
  • 在遍历中比较左右子树的高度差

递归分析

  1. 参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度
  2. 那么如何标记左右子树是否差值大于1呢?可以返回-1 来标记已经不符合平衡树的规则了
  3. 明确终止条件:递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0
  4. 明确单层递归的逻辑:分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

代码

public int getHeight(TreeNode node) {  
    if (node == null)  
        return 0;  
  
    // 左树高度  
    int leftTreeHeight = getHeight(node.left);  
    // 右树高度  
    int rightTreeHeight = getHeight(node.right);  
  
    // 假如发现子树已经不平衡,没有意义再继续比较  
    // 直接返回-1,迅速通过所有的递归过程  
    // 之后所有的递归调用结果都是-1  
    if (leftTreeHeight == -1 || rightTreeHeight == -1)  
        return -1;  
  
    int diffHeight = Math.abs(leftTreeHeight - rightTreeHeight);  
    if (diffHeight <= 1)  
        return 1 + Math.max(leftTreeHeight, rightTreeHeight);  
    else  
        return -1;  
}  
  
public boolean isBalanced(TreeNode root) {  
    if (root == null)  
        return true;  
  
    return getHeight(root) != -1;  
}

No.2

题目

二叉树的所有路径

思路

  • 递归
  • 回溯
  • 中,中为什么写在最前面?因为最后一个节点也要加入到path中
    • 不这样写的话,访问叶子节点时,会直接取用nodePath拿来构建路径,这时候该节点还没被更新到nodePath种

递归过程

  1. 参数:节点+存放节点访问路径的列表+存放结果的列表
  2. 返回值:无
  3. 终止逻辑:访问到叶子节点,以规定形式存放访问路径
  4. 单层递归内部逻辑:前序遍历,子节点非空才进入,退出访问子节点递归后,须回溯

代码

public void traverse(TreeNode node, List<Integer> nodePath, List<String> result) {  
    // preOrder traverse  
    nodePath.add(node.val); // mid  
  
    // node会为null吗?  
    if (node.left == null && node.right == null) {  
        StringBuilder sb = new StringBuilder();  
        for (Integer item : nodePath) {  
            sb.append(item);  
            sb.append("->");  
        }  
        sb.deleteCharAt(sb.length() - 1);  
        sb.deleteCharAt(sb.length() - 1);  
        result.add(sb.toString());  
        return;    
    }  
  
    // 防止空节点进入nodePath  
    if (node.left != null) { // left  
        traverse(node.left, nodePath, result);  
        nodePath.remove(nodePath.size() - 1);  
    }  
    if (node.right != null) { // right  
        traverse(node.right, nodePath, result);  
        nodePath.remove(nodePath.size() - 1);  
    }  
}  
  
public List<String> binaryTreePaths(TreeNode root) {  
    List<Integer> nodePath = new ArrayList<>();  
    List<String> result = new ArrayList<>();  
    traverse(root, nodePath, result);  
  
    return result;  
}

No.3

题目

思路

  • 递归法
  • 左叶子只能通过父节点去判断

递归分析

  1. 参数:节点,返回值:子树左叶子值之和
  2. 终止逻辑:找到了左叶子
  3. 单层递归处理逻辑:后序遍历,等待左右子树结果返回后相加

代码

public void findLeftLeaves(TreeNode node, List<Integer> leftList) {
	// node不会为null
    if (node.left != null && node.left.left == null && node.left.right == null) {  
        leftList.add(node.left.val);  
    }  
  
    if (node.left != null)  
        findLeftLeaves(node.left, leftList);  
    if (node.right != null)  
        findLeftLeaves(node.right, leftList);  
	// 无需处理中间节点
}  
  
public int sumOfLeftLeaves(TreeNode root) {  
    List<Integer> leftLeafList = new ArrayList<>();  
    findLeftLeaves(root, leftLeafList);  
  
    int result = 0;  
    for (Integer integer : leftLeafList) {  
        result += integer;  
    }  
  
    return result;  
}

标签:node,nodePath,递归,Leetcode,Day17,二叉树,null,节点,left
From: https://www.cnblogs.com/tomatoQt/p/17658213.html

相关文章

  • [刷题记录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,......
  • 20天 hot 100 速通计划-day17
    动态规划70.爬楼梯假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶。1.1......