数据结构与算法分析笔记与总结(java实现)--二叉树23:树的子结构

本文介绍了如何判断一棵二叉树是否是另一棵二叉树的子结构。通过先序遍历和递归方法,检查两棵树的结点值和子树结构,具体实现包括`HasSubtree`和`DoesTree1HavaTree2`两个关键函数,后者用于判断树的包含关系。在遍历过程中,遇到相同结点值时进行深度判断,确保所有子树结构匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)


思路:何为子结构,就是具有相同值的结点和结点关系的若干个结点组成的结构。基本思想是保持树B不动,先遍历树A,找到与树B相同的根结点,遍历树A可以使用先序遍历或者其他遍历方式都可以,只需要在遍历结点的代码中添加上判断是否相同的逻辑即可,如果遇到相同的结点node,此时进行判断,即判断在树node中是否包含B,这里可以将判断逻辑封装到一个函数DoesTree1HavaTree2(root1,root2)中,DoesTree1HavaTree2(root1,root2)里面的逻辑是判断在树root1中是否包含树root2,需要判断各个结点是否相同,然后对子节点再次判断新的子树root1中是否包含子树root2(不管root1和root2是否为null都要判断是否包含)。注意要判断的是root1中是否包含root2,而不是root1是否等于root2,先判断root1和root2结点是否满足包含的要求,然后对root1.left和root2.left以及root1.right和root2.right分别进行是否包含的判断。判断2个结点是否包含的逻辑很清晰:如果root2==null,那么不管root1是否==null,都应该是true;如果root1!=null,当root1==null时返回false,当root1!=null&&root2!=null时,判断root1.val与root2.val是否相同,如果不同则返回false,如果相同,则对它们的孩子分别进行包含性的判断,即DoesTree1HavaTree2(root1.left, root2.left)&&DoesTree1HavaTree2(root1.right, root2.right),如果都为true,则表示root1是真正包含root2的。

总结:本题首先对整棵树A进行先序遍历,在遍历代码区域添加if()语句块来判断是否遇到相同的结点,如果遇到相同的结点再进行进一步的判断逻辑,调用DoesTree1HavaTree2(root1,root2)方法判断root1中是否包含root2,这是一个递归方法,会遍历所有结点,直到root2遍历结束,何时结束?当root2==null时就return true。对root1和root2的左右子树分别进行DoesTree1HavaTree2判断,如果都为true则返回true即可。本题需要设计2个递归,一个遍历结点,一个判断2棵树是否具有包含的关系,即在递归里面套递归,但是原理较简单,按照逻辑来解决也不麻烦。

注意:DoesTree1HavaTree2(root1,root2)用来判断树root1是否包含树root2,且此时root1和root2是相同的,之所以在方法体代码中还要判断root1和root2是否相同是对于root1,root2下面的子树之间的包含关系时用的。而题目初始给定的pRoot1和pRoot2是不相同的,因此不能直接使用DoesTree1HavaTree2(pRoot1,pRoot2)来进行判断,要先遍历A找到A中与B相同根结点的结点再调用DoesTree1HavaTree2(root1,root2)进行包含性判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值