最近在刷剑指offer,把自己的理解写下来

01 题目

输入两颗二叉树 A和B,判断B是不是A的子结构

如:

算法面试题之二叉树的子结构

A

算法面试题之二叉树的子结构

B

B是A的子结构,B中的节点与A的孩子结构 2,5,6 完全对应。

02 解题

二叉树的每个结点最多有两个子树的树结构。通常左孩子节点,被称为左子树,右孩子节点也可以称为右子树。

判断B是否为A的子树,即要对比B的树结构在A中是否存在,所以我们需要一个对比函数,对比A 节点与B节点是否存在完全相同的树结构。

除此之外,我们还需要定位A中与B根节点相同的节点。

过程如下:

算法面试题之二叉树的子结构

 

算法面试题之二叉树的子结构

 

算法面试题之二叉树的子结构

 

算法面试题之二叉树的子结构

 

算法面试题之二叉树的子结构

 

算法面试题之二叉树的子结构

 

03 代码

判断tree1中是否有节点与tree2的根节点相同

算法面试题之二叉树的子结构

 

判断tree1的节点是否与tree2的节点完全相同

算法面试题之二叉树的子结构

 

04 总结

只要想清楚,分两步这道题就很清晰。如果考虑在一个递归里完成,就不容易解出来。另外本体用到了前序遍历二叉树的知识点。前序遍历即,根节点,左孩子节点,右孩子节点的遍历顺序。

测试用例

边界测试:分别输入A节点和B节点为null

普通测试:输入A,B都有节点,B是A的子结构,B不是A的子结构

特殊测试:输入树结构,只有左孩子节点,或者只有右孩子节点。

 

相关文章: