栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

0x00 题目

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

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

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


0x01 思路

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

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

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

时间复杂度: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])
}

小程序

学习五笔好帮手~


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/680688.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号