LeetCode57--单值二叉树、二叉树的堂兄弟节点

1.单值二叉树

//如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 
//
// 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 
//
// 
//
// 示例 1: 
//       1
//           / \
//        1   1
//       / \   \
//      1   1   1
//
// 输入:[1,1,1,1,1,null,1]
//输出:true
// 
//
// 示例 2: 
//    2
//    / \
//    2   2
//   / \
//  5   2
// 输入:[2,2,2,5,2]
//输出:false
// 
//
// 
//
// 提示: 
//
// 
// 给定树的节点数范围是 [1, 100]。 
// 每个节点的值都是整数,范围为 [0, 99] 。 
// 
// Related Topics 树
class Solution {
		int ans;
    public boolean isUnivalTree(TreeNode root) {
		ans = root.val;
		boolean helper = helper(root);
		return helper;
	}
    private boolean helper(TreeNode root){
    	if(root == null){
    		return true;
		}
    	if(root.left != null && root.left.val != ans){
    		return false;
		}
    	if(root.right != null && root.right.val != ans){
    		return false;
		}
    	return helper(root.left) && helper(root.right);
	}
}

 2.二叉树的堂兄弟节点

//在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 
//
// 如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。 
//
// 我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。 
//
// 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。 
//
// 
//
// 示例 1: 
//       1
//         / \
//        2   3
//         \   \
//          4   5
// 输入:root = [1,2,3,4], x = 4, y = 3
//输出:false
// 
//
// 示例 2: 
//       1
//      / \
//     2   3
//      \
//       4
// 输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
//输出:true
// 
//
// 示例 3: 
//
// 
//
// 输入:root = [1,2,3,null,4], x = 2, y = 3
//输出:false 
//
// 
//
// 提示: 
//
// 
// 二叉树的节点数介于 2 到 100 之间。 
// 每个节点的值都是唯一的、范围为 1 到 100 的整数。 
// 
//
// 
// Related Topics 树 广度优先搜索

用广度优先遍历反而还更复杂了,我们直接使用两个HashMap,将每个节点的值和其对应的深度以及父节点给记录下来,这样我们直接从HashMap中就能直接通过键(节点的值)获取深度和父节点的信息。

class Solution {
	HashMap<Integer, Integer> depth;
	HashMap<Integer, TreeNode> parent;
    public boolean isCousins(TreeNode root, int x, int y) {
		depth = new HashMap<>();
		parent = new HashMap<>();
		dfs(root, null);
		return depth.get(x)==depth.get(y) && parent.get(x) != parent.get(y);
	}
	private void dfs(TreeNode node, TreeNode par){
    	if(node != null){
    		depth.put(node.val,par == null ? 0 : 1 + depth.get(par.val)+1);
    		parent.put(node.val, par);
    		dfs(node.left, node);
    		dfs(node.right, node);
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值