【leetcode 993】【二叉树的堂兄弟节点】

leetcode 993【二叉树的堂兄弟节点】

这道题给出二叉树root,x和y,要解决的问题是在树中找到x和y,并且确定它们是否为堂兄弟节点的关系。

题目链接

https://leetcode-cn.com/problems/cousins-in-binary-tree/


解题思路与代码思路:

队列实现、BFS

广度优先遍历每一层,存入队列中,判断x和y是否在同一层,如果在,就是判断是否为堂兄弟节点。在同一层中,只有相邻节点并且右边的节点的索引为奇数、左边节点索引为偶数时,才是同一个父节点。如果不满足上面条件,则就是堂兄弟节点

递归DFS

深度优先搜索标记每一个节点,对于每个节点,都存储它的父亲节点和深度到对应的字典中,最后判断x和y在这两个字典中的值就可以了


代码:

BFS法
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


class Solution(object):
    def isCousins(self,root,x,y):
        ans = [root]    
        while ans:
            tmp = []            # 存储本层的所有值
            n = len(ans)        # 每次循环拿一层的数组
     
            for i in range(n):  #这个循环把所有节点值存入tmp,然后ans存入每个点的左右孩子
                r = ans.pop(0)   #每一个节点
                if r:
                    tmp.append(r.val)
                    ans.append(r.left)   #秘诀在这里,把左右孩子放回去
                    ans.append(r.right)
                else:
                    tmp.append(None) #如果是空结点,方便判断是否为同一父节点
            print(tmp)
            if x in tmp and y in tmp:
                left = tmp.index(x)  #获取x的索引位置
                right = tmp.index(y)  
                if left>right:          # l比r大,调整一下,方便判断,保证r比l大
                    left,right=right,left
                if right-1 == left and right%2 != 0 :  
                    #只有l,r相邻并且r为奇数时(l为偶数),才是同一父节点
                    return False
                return True

        return False
t = TreeNode(val=1,left=TreeNode(val=2,left=TreeNode(4),right=TreeNode(5)),right=TreeNode(val=3,left=TreeNode(6),right=TreeNode(7)))

s = Solution()
s.isCousins(t,5,7)
DFS递归
class Solution(object):
    def isCousins(self,root,x,y):
        parent = {}  #节点的值对应它的parent
        depth = {}   # 节点值对应它的深度
        def dfs(node,par=None):
            if node:
                depth[node.val] = 1+ depth[par.val] if par else 0
                parent[node.val] = par
                dfs(node.left,node)
                dfs(node.right,node)
        dfs(root)
        return depth[x]==depth[y] and parent[x] != parent[y]

复 杂 度 分 析 : \color{red}{复杂度分析:}
  1. BFS
  • 时间复杂度: 看看x和y在哪一层吧,到那一层的最大节点数, O(K)
  • 空间复杂度: O(K)
  1. DFS
  • 时间复杂度: O(N) , N为树的节点数量
  • 空间复杂度: O(N)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值