/**
* 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 {
public:
// isSubStructure 相当于先序遍历
// isMatched “访问”函数,用以匹配从当前根节点出发的A树中是否含有B
bool isMatched(TreeNode*A, TreeNode*B){
// 判断从当前根节点出发,A树是否含有B
// 先写递归终止条件:
// 1 B空,B走完了(B走完了,说明到上一个结点为止,都匹配成功了。现在A空不空都无所谓)
// 2 A空B不空 (不匹配,A走完了B还没走完)
// 3 两者值不相等,不匹配
if(B==NULL)
return true; // 匹配完成
if(A==NULL) // 如果能判断这里,说明B不为空,即“A空B不空,不匹配”
return false;
if(A->val!=B->val)
return false;
// 递归(说明此时两者结点的值一致,进而判断两者的左子树和右子树是否相等)
return isMatched(A->left, B->left) && isMatched(A->right, B->right);
}
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(A==NULL || B==NULL)
return false;
// 根节点存在,“访问根节点”。从当前根节点进入进行匹配isMatched(A, B)
// 否则,“先左后右”。判断A的左子树是否含有B,或者A的右子树是否含有B (先序遍历)
if (isMatched(A,B)) // 先序中的根,isMatched(A,B)就当作访问函数
return true;
else
return (isSubStructure(A->left,B) || isSubStructure(A->right,B)); // 先序中的左和右
}
};
剑指 Offer 26. 树的子结构
最新推荐文章于 2022-05-24 17:36:34 发布