2022-2-19 剑指offer day9
题1:
JZ26 树的子结构
描述
输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构
数据范围:
0 <= A的节点个数 <= 10000
0 <= B的节点个数 <= 10000
1 /** 2 public class TreeNode { 3 int val = 0; 4 TreeNode left = null; 5 TreeNode right = null; 6 7 public TreeNode(int val) { 8 this.val = val; 9 10 } 11 12 } 13 */ 14 public class Solution { 15 public boolean HasSubtree(TreeNode root1,TreeNode root2) { 16 if (root1==null||root2==null) return false; 17 return dfs(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2); 18 } 19 20 public boolean dfs(TreeNode t1,TreeNode t2) { 21 if (t2==null) return true; 22 if (t1==null) return false; 23 if (t1.val==t2.val) return dfs(t1.left,t2.left) && dfs(t1.right,t2.right); 24 return false; 25 } 26 }
思路:双重递归,hassubtree表示判断 是否有子树,dfs判断两个以当前根节点匹配是否为子树。那么判断是否子树就是 以根节点匹配或者左右子树 包含子树 。
题2:
JZ27 二叉树的镜像
描述
操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围:二叉树的节点数 0 \le n \le 10000≤n≤1000 , 二叉树每个节点的值 0\le val \le 10000≤val≤1000
要求: 空间复杂度 O(n)O(n) 。本题也有原地操作,即空间复杂度 O(1)O(1) 的解法,时间复杂度 O(n)O(n)
比如:
源二叉树
镜像二叉树
1 import java.util.*; 2 3 /* 4 * public class TreeNode { 5 * int val = 0; 6 * TreeNode left = null; 7 * TreeNode right = null; 8 * public TreeNode(int val) { 9 * this.val = val; 10 * } 11 * } 12 */ 13 14 public class Solution { 15 /** 16 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 17 * 18 * 19 * @param pRoot TreeNode类 20 * @return TreeNode类 21 */ 22 public TreeNode Mirror (TreeNode pRoot) { 23 // write code here 24 if (pRoot!=null) { 25 TreeNode temp=pRoot.left; 26 pRoot.left=pRoot.right; 27 pRoot.right=temp; 28 Mirror(pRoot.left); 29 Mirror(pRoot.right); 30 } 31 return pRoot; 32 } 33 }
思路:递归。先交换左子树和右子树,在递归交换左右子树。