剑指Offer第十题:树的子结构

问题描述

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

问题分析

判断B是不是A的子树,除了不考虑空树之外,我们需要将B的根节点在A中寻找和他相等的节点,找到相应节点后,再依次比较剩下的节点。一般树的操作都用的递归,比较简单,但是理解上比较难理解,不过多兰几遍就明白了。

算法分析

  • 题目已经说明空树不是任意的树的子结构,那么空树不能考虑做子树。
  • 在整个算法下的要求就是两棵树都不能为空。
  • 首先我们得遍历A树寻找到和B树根节点相等的值(这是一个函数).
  • 然后找到相应的节点后,我们需要封装一个函数来判断是不是子树。

Ps:递归调用主要是参数的控制。

源代码

 

 1 class TreeNode {
 2     int val;
 3     TreeNode left;
 4     TreeNode right;
 5 
 6     TreeNode(int x) {
 7         val = x;
 8     }
 9 }
10 
11   
12 
13   public boolean HasSubtree(TreeNode root1,TreeNode root2) {
14         boolean isSubtree=false;//定义一个标记符作为最后的结果返回
15         if(root1!=null&&root2!=null) {//由题目要求,子树存在的条件是,两棵树都不为空
16             if(root1.val==root2.val) {//判断节点是否找到。
17                 isSubtree=isTree(root1,root2);//判断是不是子树
18             }
19             if(!isSubtree) {//如果还没有找到,那么先从左子树遍历,HasSubtree函数的A树就root1.left操作
20                 isSubtree=HasSubtree(root1.left, root2);
21             }
22             if(!isSubtree) {//如果还没有找到,那么先从左子树遍历,HasSubtree函数的A树就root1.right操作
23                 isSubtree=HasSubtree(root1.right, root2);
24             }
25         }
26         
27         return isSubtree;
28     }
29     
30     public boolean isTree(TreeNode r1,TreeNode r2) {
31         if(r2==null)//如果r2为空,那么r2是r1的子树
32             return true;
33         if(r1==null)//反之不是
34             return false;
35         if(r1.val!=r2.val)//如果其中的一个节点不一样,那么表示不是子树。
36             return false;
37         return isTree(r1.left, r2.left)&&isTree(r1.right, r2.right);//依次遍历递归,知道找到为止
38     }

 

posted @ 2018-09-04 15:31  轻抚丶两袖风尘  阅读(111)  评论(0编辑  收藏  举报