力扣461翰明距离543. 二叉树的直径617. 合并二叉树

461. 汉明距离

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

给出两个整数 x 和 y,计算它们之间的汉明距离。

注意:
0 ≤ x, y < 231.

示例:

输入: x = 1, y = 4

输出: 2

解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑

上面的箭头指出了对应二进制位不同的位置。

class Solution {
    
    
    public int hammingDistance(int x, int y) {
    
    
        int a = x^y;
        return Integer.bitCount(a);
    }
}

543. 二叉树的直径

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例 :
给定二叉树

      1
     / \
    2   3
   / \     
  4   5    

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

思路:深度优先搜素
遍历每一个节点的最大值,记录该节点左节点的长度和右节点长度的和,利用全局变量保留其中的最大值


首先我们知道一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减一。
我们定义一个递归函数 depth(node) 计算 d_{
    
    \textit{
    
    node}}d 
node
​	
  ,函数返回该节点为根的子树的深度。先递归调用左儿子和右儿子求得它们为根的子树的深度 LL 和 RR ,则该节点为根的子树的深度即为

max(L,R)+1
max(L,R)+1

该节点的 d_{
    
    \textit{
    
    node}}d 
node
​	
  值为

L+R+1
L+R+1

递归搜索每个节点并设一个全局变量 ansans 记录点node为起点的路径经过节点数的最大值为dnode,最后返回 ans-1 即为树的直径。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210110222533507.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMzEwNzEw,size_16,color_FFFFFF,t_70)

而任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。

class Solution {
    
    
    int ans;
    public int diameterOfBinaryTree(TreeNode root) {
    
    
        ans = 1;
        depth(root);
        return ans - 1;
    }
    public int depth(TreeNode node) {
    
    
        if (node == null) {
    
    
            return 0; // 访问到空节点了,返回0
        }
        int L = depth(node.left); // 左儿子为根的子树的深度
        int R = depth(node.right); // 右儿子为根的子树的深度
        ans = Math.max(ans, L+R+1); // 计算d_node即L+R+1 并更新ans
        return Math.max(L, R) + 1; // 返回该节点为根的子树的深度
    }
}


class Solution {
    
    
    int maxd=0;
    public int diameterOfBinaryTree(TreeNode root) {
    
    
        depth(root);
        return maxd;
    }
    public int depth(TreeNode node){
    
    
        if(node==null){
    
    
            return 0;
        }
        int Left = depth(node.left);
        int Right = depth(node.right);
        maxd=Math.max(Left+Right,maxd);//将每个节点最大直径(左子树深度+右子树深度)当前最大值比较并取大者
        return Math.max(Left,Right)+1;//返回节点深度
    }
}

617. 合并二叉树

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

输入:
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
输出:
合并后的树:
3
/
4 5
/ \ \
5 4 7
注意: 合并必须从两个树的根节点开始。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
    
    
        if (t1 == null) {
    
    
                    return t2;
                }
                if (t2 == null) {
    
    
                    return t1;
                }
                TreeNode merged = new TreeNode(t1.val + t2.val);
                merged.left = mergeTrees(t1.left, t2.left);
                merged.right = mergeTrees(t1.right, t2.right);
        return merged;

    }
}

猜你喜欢

转载自blog.csdn.net/qq_40310710/article/details/112447183
今日推荐