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

0x00 题目

在二叉树中,根节点位于深度 0 处
每个深度为 k 的节点的子节点位于深度 k+1 处
如果二叉树的两个节点 深度 相同
父节点 不同 ,则它们是一对 堂兄弟 节点

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

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


0x01 思路

两个节点的深度要相同,但是父节点不相同

题目给出的二叉树是:具有 唯一 值的

所以,可以先遍历整棵树
把每个节点的 节点及 高度 保存
再通过节点 xy 的值
取出对应的 节点及 高度 进行比较即可

时间复杂度:O(N) 要遍历到每个节点
空间复杂度:O(N) 要存储每个节点对应的值与高度


0x02 解法

语言:Swift

树节点:TreeNode

public class TreeNode {
    public var val: Int
    public var left: TreeNode?
    public var right: TreeNode?
    public init() { self.val = 0; self.left = nil; self.right = nil; }
    public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
    public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
        self.val = val
        self.left = left
        self.right = right
    }
}

解法:

func isCousins(_ root: TreeNode?, _ x: Int, _ y: Int) -> Bool {
    guard let root = root else { return false }
    
    var dic1: [Int: Int] = [:]  // 存储对应的深度
    var dic2: [Int: TreeNode] = [:] // 存储对应的父节点
    dic1[root.val] = 0
    
    func dfs(_ root: TreeNode?, _ pre: TreeNode) {
        guard let r = root else { return }
        
        // 高度
        dic1[r.val] = dic1[pre.val]! + 1
        
        // 父节点
        dic2[r.val] = pre
        
        dfs(r.left, r)
        dfs(r.right, r)
    }
    
    dfs(root.left, root)
    dfs(root.right, root)

    return (dic1[x] == dic1[y]) && (dic2[x] !== dic2[y])
}

小程序

学习五笔好帮手~
请添加图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豪冷啊

你的鼓励是对我的认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值