2022-6-29 剑指offer-树-递归
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public boolean isSubStructure(TreeNode A, TreeNode B) { 12 if (B==null||A==null) return false; 13 if (isSameTree(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B)) { 14 return true; 15 } 16 return false; 17 } 18 19 20 public boolean isSameTree(TreeNode a,TreeNode b){ 21 if (a==null&&b!=null) return false; 22 if (b==null) return true; 23 if (a.val!=b.val) return false; 24 if (isSameTree(a.left,b.left)&&isSameTree(a.right,b.right)) return true; 25 return false; 26 } 27 }
思路:注意是子结构而不是完全相同的结构,定义一个递归函数判断两个数是否为包含关系。总函数递归判断当前节点,左右子树分别是否为包含b的树。