第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

LeetCode 652: 尋找重復的子樹 Find Duplicate Subtrees

標簽:
Java Python 算法

LeetCode 652: 寻找重复的子树 Find Duplicate Subtrees

题目:

给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。

两棵树重复是指它们具有相同的结构以及相同的结点值。

Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of any one of them.

Two trees are duplicate if they have the same structure with same node values.

示例 1:

        1
       / \
      2   3
     /   / \
    4   2   4
       /
      4

下面是两个重复的子树:

      2
     /
    4

    4

因此,你需要以列表的形式返回上述重复子树的根结点。

Therefore, you need to return above trees’ root in the form of a list.

解题思路:

这就是一道考察二叉树遍历的题, 遍历的时候序列化作为 String 类型存入 Map, 若其为第二次出现即将该结点加入数组.

代码:

这里以后序遍历为例, 需要注意叶子结点应当规定一个特殊字符作为替代 null 结点, 这里用的是 ‘#’

Java:

class Solution {
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        List<TreeNode> list = new ArrayList<>();//待返回数组
        if (root == null) return list;
        Map<String, Integer> map = new HashMap<>();//哈希映射查找重覆子结点
        traverse(root, map, list, "");
        return list;
    }
	//后序遍历
    private String traverse(TreeNode node, Map<String, Integer> map, List<TreeNode> list, String tree) {
        if (node == null) return tree + "#";
        String left = traverse(node.left, map, list, tree);//递归左子孩子
        String right = traverse(node.right, map, list, tree);//递归右子孩子
        tree = tree + node.val + left + right;//每个子树路径

        map.put(tree, map.getOrDefault(tree, 0) + 1);//存储每个子树路径
        if (map.get(tree) == 2) list.add(node);//第二次出现相同路径时存储该结点
        return tree;
    }
}

Python:

class Solution:
    def findDuplicateSubtrees(self, root: TreeNode) -> List[TreeNode]:
        res = [] # 待返回数组
        if not root: return res
        hash_map = {} # 哈希映射查找重覆子结点
        self.traverse(root, hash_map, res, '')
        return res
	# 后序遍历
    def traverse(self, node: TreeNode, hash_map, res, tree):
        if not node: return tree + '#'
        left = self.traverse(node.left, hash_map, res, tree) # 递归左子孩子
        right = self.traverse(node.right, hash_map, res, tree) # 递归右子孩子
        tree = tree + str(node.val) + left + right # 每个子树路径
        if tree in hash_map.keys(): # 存储每个子树路径
            hash_map[tree] += 1
        else:
            hash_map[tree] = 1
        if hash_map[tree] == 2: # 第二次出现相同路径时存储该结点
            res.append(node)
        return tree
點擊查看更多內容
1人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質文章

正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優(yōu)惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消