面试题26
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例 1:
输入:A = [1,2,3], B = [3,1]
输出:false
示例 2:
输入:A = [3,4,5,1,2], B = [4,1]
输出:true
限制:
0 <= 节点个数 <= 10000
Solutions
recursion
/**
* 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:
bool dfs(TreeNode * root, TreeNode * target) {
if (!target)
return true;
if ((!root && target) || root->val != target->val)
return false;
else
return dfs(root->left, target->left) && dfs(root->right, target->right);
}
bool isSubStructure(TreeNode* A, TreeNode* B) {
if (!A || !B) return false;
if (A->val == B->val && dfs(A, B))
return true;
else
return isSubStructure(A->left, B) || isSubStructure(A->right, B);
}
};
iteration
/**
* 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:
bool same(TreeNode * root, TreeNode * target) {
queue<TreeNode *> q1; q1.push(root);
queue<TreeNode *> q2; q2.push(target);
TreeNode * top1, * top2;
// breath first traversal
while (!q2.empty()) {
top1 = q1.front(); q1.pop();
top2 = q2.front(); q2.pop();
if ((!top1 && top2) || top1->val != top2->val)
return false;
if (top2->left) {
q2.push(top2->left);
q1.push(top1->left);
}
if (top2->right) {
q2.push(top2->right);
q1.push(top1->right);
}
}
return true;
}
bool isSubStructure(TreeNode* A, TreeNode* B) {
if (!A || !B) return false;
stack<TreeNode *> s;
TreeNode * root = A;
// preorder traversal
while (root || !s.empty()) {
if (root) {
if (root->val == B->val && same(root, B))
return true;
if (root->right)
s.push(root->right);
root = root->left;
}
else {
root = s.top();
s.pop();
}
}
return false;
}
};
Last updated
Was this helpful?