二叉树——判断是否是子树
树的子结构
http://www.nowcoder.com/questionTerminal/6e196c44c7004d15b1610b9afca8bd88
1.在大树中找到和小树根节点相同的节点。
2.然后以此节点为根节点,在大树上往下搜索对比小书左右节点是否相同,不同则返回false
3.如果2步中最后返回false 回到第一步,从大树的左子树找和小树根节点相同的节点。
4.如果3步中最后返回false 回到第一步,从大树的右子树找和小树根节点相同的节点。
/* 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(!pRoot1||!pRoot2)return false; bool result = false; if(pRoot1->val==pRoot2->val) result = HasSubtreeHelper(pRoot1,pRoot2); if(result==false) result = HasSubtree(pRoot1->left,pRoot2); if(result==false) result = HasSubtree(pRoot1->right,pRoot2); return result; } bool HasSubtreeHelper(TreeNode* pRoot1, TreeNode* pRoot2) { if(pRoot2==nullptr) return true; if(pRoot1==nullptr) return false; if(pRoot1->val!=pRoot2->val) return false; return HasSubtreeHelper(pRoot1->left, pRoot2->left)&&HasSubtreeHelper(pRoot1->right, pRoot2->right); } };
HasSubtree(a,b)函数:
如果ab两个子树有一个为空,false;
如果ab根节点数值相等,进入子函数;
如果前面是false,重新进入本函数,采用HasSubtree(a->left,b);
如果前面是false,重新进入本函数,采用HasSubtree(a->right,b);
子函数HasSubtreeHelper(a,b):
如果b子树被遍历完全,返回true,也就是说所有b的节点都比较完了;
如果a子树空了,false;
如果两子树的值不等,返回false;
return:两个子树左边比较 && 两个子树右边比较。