剑指offer-day7
树的子结构
大致思路是有的:通过先序遍历来遍历主树,如果有等于子树根节点的节点,再先序遍历比较。
但是实现得磕磕绊绊,没法了,进行一个答案的抄。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
class Solution { public boolean isSubStructure(TreeNode A, TreeNode B) { if(A == null || B == null){ return false; } return (compare(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B)); }
public boolean compare(TreeNode A,TreeNode B){ if(B == null){ return true; } if(A == null || (A.val != B.val)){ return false; } return (compare(A.left,B.left) && compare(A.right,B.right)); } }
|
感觉递归的结束条件确实很难想。
二叉树的镜像
直接摆烂看答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
class Solution { public TreeNode mirrorTree(TreeNode root) { if(root == null){ return null; } TreeNode tmp = root.left; root.left = mirrorTree(root.right); root.right = mirrorTree(tmp); return root; } }
|
可以发现这道题目其实跟交换数字的思路很像,可以靠这个来记忆。
对称二叉树
跟第一题很像,都是需要遍历比较。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
class Solution { public boolean isSymmetric(TreeNode root) { if(root == null){ return true; } return compare(root.left,root.right); }
public boolean compare(TreeNode left, TreeNode right){ if(left == null && right == null){ return true; } if(left == null || right == null || left.val != right.val){ return false; } return(compare(left.left,right.right) && compare(left.right,right.left)); } }
|