美文网首页
拓扑结构相同子树练习题

拓扑结构相同子树练习题

作者: 郑明明 | 来源:发表于2017-06-23 20:17 被阅读56次
题目

对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。

给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。

思路
  • 序列化二叉树变成字符串
  • 利用字符串算法中的KMP算法进行模式匹配
  • 时间复杂度为O(M+N)
答案
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/

class IdenticalTree {
public:
    // ------- KMP算法 ------
    // 获取next数组
    int* getNext(char* A, int lengthA) {
        int* next = new int[lengthA];
        next[0] = -1;
        int k = -1;
        int j = 0;
        while (j < lengthA - 1) {
            if (k == -1 || A[k] == A[j]) {
                k++;
                j++;
                if (A[k] == A[j]) {
                    next[j] = next[k];
                } else {
                    next[j] = k;
                }
            } else {
                k = next[k];
            }
        }
        return next;
    }
    
    // 匹配过程
    int KMPMatch(char* A, int lengthA, char* B, int lengthB) {
        int i = 0;
        int j = 0;
        int* next = getNext(B, lengthB);
        while (i < lengthA && j < lengthB) {
            if (A[i] == B[j] || j == -1) {
                i++;
                j++;
            } else {
                j = next[j];
            }
        }
        if (j == lengthB) {
            return i - j;
        } else {
            return -1;
        }
    }
    
    // ------------ 序列化二叉树 -----------------
    void serilization(TreeNode *treeNode, vector<char> &vector) {
        if (treeNode == NULL) {
            vector.push_back('#');
            return;
        }
        vector.push_back((char)(treeNode->val + 48));
        serilization(treeNode->left, vector);
        serilization(treeNode->right, vector);
    }
    
    bool chkIdentical(TreeNode* A, TreeNode* B) {
        // write code here
        vector<char> vectorA;
        vector<char> vectorB;
        serilization(A, vectorA);
        serilization(B, vectorB);
        char *charA = new char[vectorA.size()];
        char *charB = new char[vectorB.size()];
        for(int i = 0; i < vectorA.size(); i++) {
            charA[i] = vectorA[i];
        }
        for(int i = 0; i < vectorB.size(); i++) {
            charB[i] = vectorB[i];
        }
        if(KMPMatch(charA, (int)vectorA.size(), charB, (int)vectorB.size()) == -1) {
            return false;
        } else {
            return true;
        }
    }
};

相关文章

  • 拓扑结构相同子树练习题

    题目 对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。 给定...

  • 算法(10)拓扑结构相同子树

    描述对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。给定两棵...

  • 3_2拓扑结构相同子树

    问题 序列化用了递归和非递归,字符串匹配一种是调用了string自带的find函数,一种是自己写的,KMP算法还不会……

  • 问题:寻找拓扑结构相同的子树

    对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。思路:前序遍...

  • 《简社》对仗练习

    8月25日对仗练习题,要求尽量工对(词类(词性门类)相同,结构相同,节奏相同。可选择练习,发群讲评。 1、 风流千...

  • 字符串类型面试题目总结

    字符串系列题目一览: 1.t1是否有与t2树拓扑结构相同的子树2.判断两个字符串是否互为变形词?3.判断两个字符串...

  • LeetCode 第652题:找重复的子树

    1、前言 2、思路 这道题的意思一开始确实难以理解,什么叫重复子树? 重复子树说的是两个子树具有相同的结构,而且值...

  • 拓扑结构

    本次项目拓扑 拓扑图图解: 两台网站服务器:web33 web44 读写分离结构存储数据maxscale77 主从...

  • 使用docker搭建redis主从复制、哨兵机制

    1. 拓扑结构 本文搭建如下图所示的redis拓扑结构,拓扑中共有3个哨兵,1和mater结点和2个slave结点...

  • 通过Docker部署Ceph开源分布式存储系统

    拓扑结构: ------------- ------------- ------------- | G...

网友评论

      本文标题: 拓扑结构相同子树练习题

      本文链接:https://www.haomeiwen.com/subject/qgxhcxtx.html