LeetCode 第 993 题:二叉树的堂兄弟结点

62 篇文章 0 订阅
3 篇文章 2 订阅

LeetCode 第 993 题:二叉树的堂兄弟结点

传送门:993. 二叉树的堂兄弟节点

在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。

如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点

我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 xy

只有与值 xy 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false

示例 1:

img

输入:root = [1,2,3,4], x = 4, y = 3
输出:false

示例 2:

img

输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
输出:true

示例 3:

img

输入:root = [1,2,3,null,4], x = 2, y = 3
输出:false

提示:

  1. 二叉树的节点数介于 2100 之间。
  2. 每个节点的值都是唯一的、范围为 1100 的整数。

思路:使用层序遍历,如果两个结点在同一层,它们就是堂兄弟结点。

因此如果当前层只能找到其中一个结点,那么说明它们位于不同层,肯定不是堂兄弟结点,可以直接返回 False

如果在同一层可以找到两个结点,要注意排除一种情况,那就是“这两个结点的父亲结点相同”。为此,可以做如下处理,在遍历的时候,如果遇到子结点是空结点的时候,设置一个占位的数值。因为题目后面的说明:“每个结点的值都是唯一的、范围为 1 1 1 100 100 100 的整数”。因此可以把空结点设置为一个不在 1 1 1 100 100 100 中间的数,例如 0 0 0。这样在层序遍历中检查,如果两个索引序号相邻,并且索引序号小的数是偶数,索引序号大的数是奇数,那么就表示它们的父结点相同,遇到这种情况,直接返回 False,也不用往下看了。不是这种情况的话,可以返回 True

Python 代码:

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def isCousins(self, root: 'TreeNode', x: 'int', y: 'int') -> 'bool':
        if not root:
            return False
        queue = [root]
        while queue:
            # 循环开始时,队列中的元素个数就是当前层结点的个数
            size = len(queue)
            # 把一层的结点值都放进来,如果遇到空结点,放置 0,
            # 题目中说"每个节点的值都是唯一的、范围为 1 到 100 的整数。"
            # 所以,你放 101 都是可以的
            cur_level = []
            for _ in range(size):
                top = queue.pop(0)
                if top:
                    cur_level.append(top.val)
                    queue.append(top.left)
                    queue.append(top.right)
                else:
                    cur_level.append(0)

            # 如果这两个索引都在一层,只有一种情况需要排除
            # 那就是两个结点挨着,并且索引小的结点的索引是偶数
            if x in cur_level and y in cur_level:
                index1 = cur_level.index(x)
                index2 = cur_level.index(y)
                if index1 > index2:
                    index1, index2 = index2, index1
                if index1 + 1 == index2 and index1 & 1 == 0:
                    return False
                return True
            # 如果索引不在同一层,直接就可以返回不是堂兄弟结点了
            if x in cur_level or y in cur_level:
                return False
        return False

提交结果:

image-20190226105100495

(本节完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值