剑指Offer(第二版):55 - II. 平衡二叉树 54. 二叉搜索树的第k大节点 39. 数组中出现次数超过一半的数字 15.二进制中1的个数 28. 对称的二叉树 65. 不用加减乘除做加法

这篇博客探讨了如何判断一棵二叉树是否平衡,通过递归计算左右子树的深度并比较它们的差值来实现。同时,文章还介绍了如何找到二叉树中的第k大节点,以及求解整数的汉明重量。此外,还涉及到了数组的中位数查找和二叉树的对称性检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null)
            return true;
        int lefDep = depth(root.left);
        int rigDep = depth(root.right);

        return ((rigDep-lefDep<=1) && (rigDep-lefDep>=-1)) ? (isBalanced(root.left) && isBalanced(root.right)) : false;
    }

    //每个节点的深度
    private int depth(TreeNode node){

        return node == null ? 0 : Math.max(depth(node.left) , depth(node.right)) + 1;
    
    }
}

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
 
 /**
 解题思路:
    首先我们遍历树,将他们的值放入到数组中,然后排序,再取值, dfs
  */
class Solution {

    //创建列表
    List<Integer> list_arr = new ArrayList<>();

    public int kthLargest(TreeNode root, int k) {
        if(root == null)
            return 0;

        dfs(root);

        //到此列表就填满了值,然后排序


        return list_arr.get(list_arr.size() -k);
    }

    private void dfs(TreeNode node){
        if(node == null)
            return;
        
        dfs(node.left);

        list_arr.add(node.val);

        dfs(node.right);
    }

}

在这里插入图片描述

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

在这里插入图片描述

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        return Integer.bitCount(n);
    }
}

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int count = 0;
        while(n!=0){
            count++;
            n = n&(n-1);
        }
        return count;
    }
}

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null)
            return true;
        return isSubSym(root.left , root.right);
    }
    private boolean isSubSym(TreeNode node1 , TreeNode node2){
        if(node1 == null && node2 == null)
            return true;
        if(node1 == null || node2 == null)
            return false;
        return node1.val == node2.val &&  isSubSym(node1.left , node2.right) && isSubSym(node1.right , node2.left);
    }
}

在这里插入图片描述

/**
    底层运算
 */
class Solution {
    public int add(int a, int b) {
        while(b!=0){
            int c = (a & b) << 1 ; //c是进位
            a^=b;  //a为非进位和
            b = c;
        }
        return a;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值