【二叉树】在受污染的二叉树中查找元素

0x00 题目

给出一个满足下述规则的二叉树:
root.val == 0
如果 treeNode.val == xtreeNode.left != null
那么 treeNode.left.val == 2 * x + 1
如果 treeNode.val == xtreeNode.right != null
那么 treeNode.right.val == 2 * x + 2
现在这个二叉树受到「污染」,所有的 treeNode.val 都变成了 -1

请你先还原二叉树,然后实现 FindElements 类:

FindElements(TreeNode* root) 用受污染的二叉树初始化对象,你需要先把它还原
bool find(int target) 判断目标值 target 是否存在于还原后的二叉树中并返回结果


0x01 思路

还原二叉树,根据节点与节点的关系
即可计算出来
是否包含,使用集合来判断即可
在恢复二叉树的过程中
把值添加到集合即可


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
    }
}

解法:

class FindElements {
    var set = Set<Int>()

    init(_ root: TreeNode?) {
        root?.val = 0
        set.insert(0)
        
        // 修复二叉树
        fix(root)
    }

    func find(_ target: Int) -> Bool {
        return set.contains(target)
    }

    private func fix(_ root: TreeNode?) {
        // 左节点不为空
        if let left = root?.left {
            let val = (root!.val << 1) + 1
            set.insert(val)
            left.val = val
            fix(left)
        }
        // 右节点不为空        
        if let right = root?.right {
            let val = (root!.val << 1) + 2
            set.insert(val)
            right.val = val
            fix(right)
        }
    }
}



0x03 我的作品

欢迎体验我的作品之一:小五笔 86 版
五笔学习好帮手!
App Store 搜索即可~


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

豪冷啊

你的鼓励是对我的认可!

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

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

打赏作者

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

抵扣说明:

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

余额充值