解题思路
这是一个二叉树的递归遍历问题。需要判断树B是否是树A的子树,关键是要正确处理树的结构比较。
关键点:
- 递归遍历树A的每个节点
- 判断以当前节点为根的子树是否与B相同
- 正确处理空节点情况
- 区分子树和部分结构的概念
算法步骤:
- 遍历树A的每个节点
- 对每个节点判断是否与B相同
- 递归比较子树结构
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class IdenticalTree {
public:
bool chkIdentical(TreeNode* A, TreeNode* B) {
// 如果A为空,无法包含任何子树
if (A == nullptr) {
return false;
}
// 如果B为空,认为是A的子树
if (B == nullptr) {
return true;
}
// 检查当前节点开始的子树是否相同
if (isSameTree(A, B)) {
return true;
}
// 递归检查A的左右子树
return chkIdentical(A->left, B) || chkIdentical(A->right, B);
}
private:
bool isSameTree(TreeNode* A, TreeNode* B) {
// 两个都为空,认为相同
if (A == nullptr && B == nullptr) {
return true;
}
// 其中一个为空,另一个不为空,不相同
if (A == nullptr || B == nullptr) {
return false;
}
// 检查当前节点值是否相同
if (A->val != B->val) {
return false;
}
// 递归检查左右子树
return isSameTree(A->left, B->left) && isSameTree(A->right, B->right);
}
};
public class IdenticalTree {
public boolean chkIdentical(TreeNode A, TreeNode B) {
// 如果A为空,无法包含任何子树
if (A == null) {
return false;
}
// 如果B为空,认为是A的子树
if (B == null) {
return true;
}
// 检查当前节点开始的子树是否相同
if (isSameTree(A, B)) {
return true;
}
// 递归检查A的左右子树
return chkIdentical(A.left, B) || chkIdentical(A.right, B);
}
// 判断两棵树是否完全相同
private boolean isSameTree(TreeNode A, TreeNode B) {
// 两个都为空,认为相同
if (A == null && B == null) {
return true;
}
// 其中一个为空,另一个不为空,不相同
if (A == null || B == null) {
return false;
}
// 检查当前节点值是否相同
if (A.val != B.val) {
return false;
}
// 递归检查左右子树
return isSameTree(A.left, B.left) && isSameTree(A.right, B.right);
}
}
# -*- coding:utf-8 -*-
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class IdenticalTree:
def chkIdentical(self, A, B):
# 如果A为空,无法包含任何子树
if A is None:
return False
# 如果B为空,认为是A的子树
if B is None:
return True
# 检查当前节点开始的子树是否相同
if self.isSameTree(A, B):
return True
# 递归检查A的左右子树
return self.chkIdentical(A.left, B) or self.chkIdentical(A.right, B)
def isSameTree(self, A, B):
# 两个都为空,认为相同
if A is None and B is None:
return True
# 其中一个为空,另一个不为空,不相同
if A is None or B is None:
return False
# 检查当前节点值是否相同
if A.val != B.val:
return False
# 递归检查左右子树
return self.isSameTree(A.left, B.left) and self.isSameTree(A.right, B.right)
算法及复杂度
- 算法:递归遍历
- 时间复杂度:,其中 是 树的节点数, 是 树的节点数
- 空间复杂度:,其中 和 分别是 和 的高度,用于递归栈空间