zoukankan      html  css  js  c++  java
  • LC 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.

    Example 1:

            1
           / 
          2   3
         /   / 
        4   2   4
           /
          4
    

    The following are two duplicate subtrees:

          2
         /
        4
    

    and

        4
    

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

    Runtime: 40 ms, faster than 18.69% of C++ online submissions for Find Duplicate Subtrees.

    考的是怎么把树序列化表示,我的写法比较繁琐,运行时间也比较长。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    private:
      unordered_map<string,int> map;
    public:
      vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
        vector<TreeNode*> ret;
        helper(root, ret);
        //for(auto it : map) cout << it.first << endl;
        return ret;
      }
      string helper(TreeNode* root, vector<TreeNode*> & ret){
        if(!root) return "";
        string rootval = to_string(root->val);
        string tmp = rootval;
        if(!root->left && root->right){
          tmp = rootval + " Null " + helper(root->right, ret);
        }else if(root->left && !root->right){
          tmp = rootval + " " + helper(root->left,ret) + " Null ";
        } else if (root->left && root->right){
          tmp = rootval + " " + helper(root->right,ret) + " " + helper(root->left,ret);
        }
        //if(root->val == 4) cout << tmp << endl;
        if(map.count(tmp)) {
          if(map[tmp] == 1) {
            ret.push_back(root);
            map[tmp]++;
          }
        }else {
          map[tmp] = 1;
        }
        return tmp;
      }
    };

    下面是写的比较顺的一种。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    
    // We can serialize each subtree. Perform a depth-first search, where the recursive function returns the serialization of the tree. At each node, record the result in a map, and analyze the map after to determine duplicate subtrees.
    class Solution {
    public:
        vector<TreeNode*> findDuplicateSubtrees(TreeNode* root) {
            
            //store count of each serialized tree
            unordered_map<string, int>mymap;
            vector<TreeNode*> res;
    
            DFS(root,mymap,res);
            return res; 
        }
        
        string DFS(TreeNode* root, unordered_map<string, int> &mymap, vector<TreeNode*> &res){
            if(!root){
                return "#";
            }
            
            string s = to_string(root->val) + "," + DFS(root->left, mymap, res) + "," + DFS(root->right, mymap, res);
            if(++mymap[s]==2)
                res.push_back(root);
            return s;       
        }
    };

    更有人用了bit,惊了。

          long key=((static_cast<long>(node->val))<<32 | helper(node->left, ans)<<16 | helper(node->right, ans));
  • 相关阅读:
    django模型005
    django模型004
    django视图003
    django视图002
    django视图001
    开始学习Django框架,感谢虫师,这里会记录学习的过程和心得!开始Django吧!
    新手超详细的Github教程,MAC版本非windows版本
    GitHub 新手详细教程(转载)
    解决MAC电脑Sequel Pro encountered an unexpected error 问题(转载)
    python用二进制读取文件
  • 原文地址:https://www.cnblogs.com/ethanhong/p/10177263.html
Copyright © 2011-2022 走看看