剑指offer JZ26 树的子结构

题目

剑指offer JZ26 树的子结构

思路

这道题目的关键在于使用双迭代结构
在当前节点进行判断,是否符合子结构
若符合:返回true
若不符合:对当前节点的左右子树分别再次进行判断,若存在符合,返回true,否则继续迭代

双迭代:1、判断是否符合子结构
2、遍历整个A树

对于判断是否是子结构:
if 当前根节点不等,直接返回false
else 当前根节点相等,判断左右子树
返回:left and right

代码

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if(!pRoot2||!pRoot1)//任何一个为空,则为false
            return false;
        else//当前均不空
        {
            if(son(pRoot1,pRoot2))//当前根节点即为子结构
                return true;
            if(HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2))//迭代左右子树
                return true;
            else
                return false;
        }
        
        
    }
    //判断当前节点有没有子结构
    bool son(TreeNode * root,TreeNode*index)
    {
        bool left=true,right=true;
        if(!root||root->val!=index->val)//当前节点不等
            return false;
        //对左右分别迭代
        if(index->left)
            left=son(root->left,index->left);
        if(index->right)
            right=son(root->right,index->right);
        return left and right;
        
    }
};
上一篇:Elasticsearch HttpClient方式连接


下一篇:ES安装步骤