在我的数据结构与算法实现系列文章——实现二叉搜索树中,我们知道了二叉树最多只能有两个子节点:左子节点、右子节点。那么,在本题中要判断是否包含,可以分为两步来实现:
如果树A的节点与树B的根结点相同,则执行进一步的判断(比对两棵树的子结构)得出比对结果
如果得出的结果为false,分别递归树A的左子节点与右子节点跟树B进行比对,直至任意一棵树的叶子节点
如果树B为null则代表树A中包含树B,返回true
如果树A为null则代表树A中不包含树B,返回false
如果比对的两个节点不等,则代表当前A的子树中不包含树B结构,返回false
否则,继续执行递归,直至任意一棵树的叶子节点
通过上个章节的分析,我们已经得出了具体的思路,接下来,我们就将思路转换为代码,如下所示:
实现主函数,判断B是否为A的子结构:
递归树A将其与树B的节点进行比对,找到相同的节点再做进一步的比对
export function TreeSubstructure(
treeA: BinaryTreeNode | null | undefined,
treeB: BinaryTreeNode | null | undefined
): boolean {
let result = false;
if (treeA != null && treeB != null) {
// 两个节点相同
if (treeA.key === treeB.key) {
// 判断树A中是否包含树B
result = treeAHaveTreeB(treeA, treeB);
}
// 继续寻找左子树与右子树
if (!result) {
result = TreeSubstructure(treeA?.left, treeB);
}
if (!result) {
result = TreeSubstructure(treeA?.right, treeB);
}
}
return result;
}
function treeAHaveTreeB(
treeA: BinaryTreeNode | null | undefined,
treeB: BinaryTreeNode | null | undefined
): boolean {
// 递归到了树B的叶节点,代表该节点存在于树A中
if (treeB == null) {
return true;
}
// 递归到树A的叶节点,代表该节点不存在于树A中
if (treeA == null) {
return false;
}
if (treeA.key !== treeB.key) {
return false;
}
// 左子树与右子树都相同
return (
treeAHaveTreeB(treeA?.left, treeB?.left) &&
treeAHaveTreeB(treeA?.right, treeB?.right)
);
}
注意:上述代码中用到了递归,如果你对其不了解,可以移步我的另一篇文章:递归的理解与实现
代码中还用到了一个自定义类型BinaryTreeNode,具体的类型定义请移步示例代码章节。
接下来,我们用思路分析章节中所举的例子来测试下上述函数能否正确执行。
const treeA: BinaryTreeNode = {
key: 8,
left: {
key: 8,
left: { key: 9 },
right: { key: 2, left: { key: 4 }, right: { key: 7 } }
},
right: { key: 7 }
};
const treeB: BinaryTreeNode = {
key: 8,
left: {
key: 9
},
right: {
key: 2
}
};
const result = TreeSubstructure(treeA, treeB);
console.log("treeA中包含treeB", result);
本文所用代码完整版请移步:
网页标题:一篇学会树的子结构
标题来源:http://www.csdahua.cn/qtweb/news15/310215.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网