拓扑结构相同子树2019-11-26

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

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

思路:检测树的叶子结点是否为空,只有状态相同即可。

class IdenticalTree {

public:

    bool chkIdentical(TreeNode* A, TreeNode* B) {

        // write code here

      if (A == NULL && B != NULL) {    //这句不能掉,否则可能会抛出空指针异常

            return false;

        }

        if (isIdentical(A, B)) {

            return true;

        }

        if (chkIdentical(A->left, B)) {

            return true;

        } else if (chkIdentical(A->right, B)) {

            return true;

        }

        return false;

    }

  bool isIdentical(TreeNode* A, TreeNode* B) {

        if (A == NULL && B == NULL) {

            return true;

        }

        if (A == NULL || B == NULL) {

            return false;

        }

        return A->val == B->val && isIdentical(A->left, B->left) && isIdentical(A->right, B->right);

    }

};


另一种思路:将其转化为字符串,从中找相同的子串,如果存在,则true,否则false

#include<iostream>

#include<vector>

#include<string>

#include<map>

usingnamespacestd;

struct TreeNode{

int val;

struct TreeNode* left;

struct TreeNode* right;

TreeNode(int x) :

val(x), left(NULL), right(NULL) {

    }

};

class IdenticalTree{

public:

bool chkIdentical(TreeNode* A, TreeNode* B)

{

string s1=toString(A),s2=toString(B);

if(s1.find(s2)!=string::npos)

return true;

else

return false;

    }

stringtoString(TreeNode* root)

{

string res;

Serialize(root,res);

returnres;

}

voidSerialize(TreeNode* root,string &res)

{

if(!root)

{

res+="#!";

return;

}

res+=IntegertoStr((*root).val);

Serialize((*root).left,res);

Serialize((*root).right,res);

}

stringIntegertoStr(int  m)

//!×öΪ½áÊø·û

{

if(!m)

return"0!";

string res;

vector temp;

while(m)

{

temp.push_back(m%10);

m=m/10;

}

for(vector::reverse_iterator riter=temp.rbegin();riter!=temp.rend();riter++)

res.push_back(*riter+48);

res.push_back('!');

return res;

}

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值