判断树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
给定的树 B:
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
题目二叉树结构
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
思路
- 用先序遍历A树,找到每一个与B树根节点相同的A树节点。每找到一个节点就执行一遍递归匹配子树的函数Compare,如果匹配失败则继续向下寻找下一个与B树根节点相同的节点,直至匹配成功。
- 匹配函数Compare则需要对每一个A、B树的节点值进行比较,相等则继续比较子节点,直至B树结束,否则返回false
题解代码+注释
class Solution {
public:
bool compare(TreeNode *A,TreeNode *B){//匹配函数
if(!B)return true;//如果B先于A为空,说明B是A的子树,符合条件返回true
if(!A)return false;//如果A先于B为空,说明匹配子树失败,返回false,准备寻找新的根节点开始新一轮匹配
return A->val==B->val&&compare(A->left,B->left)&&compare(A->right,B->right);
}
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(!A||!B)return false;//题目要求:空树不是任意一个树的子结构
//从A的根节点开始匹配,如果匹配失败就向下找A的其他节点作为子树的根节点跟B开始匹配,只要匹配成功则为True
return compare(A,B)||isSubStructure(A->left,B)||isSubStructure(A->right,B);
}
};