diff --git a/docs/23~44.md b/docs/23~44.md index 2f7df44..014cd6a 100644 --- a/docs/23~44.md +++ b/docs/23~44.md @@ -114,3 +114,129 @@ private static ListNode merge(ListNode realHead1, ListNode realHead2) { } ``` +# 26_树的子结构 + +> 输入两棵二叉树A和B,判断B是不是A的子结构。 + +从A的根节点开始,看是否和B的根节点相等,相等,就下去继续判断剩下的节点是否相等。不等,就用A的左右子树,作为根节点继续判断。 + +```java +private static boolean hasSubtree(BinaryTreeNode root1, BinaryTreeNode root2) { + boolean result = false; + if (root1 != null && root2 != null) { + if (root1.value == root2.value) + result = doseTree1HaveTree2(root1, root2); + if (!result) + result = hasSubtree(root1.left, root2); + if (!result) + result = hasSubtree(root1.right, root2); + } + return result; +} + +private static boolean doseTree1HaveTree2(BinaryTreeNode root1, BinaryTreeNode root2) { + if (root2 == null) + return true; + if (root1 == null) + return false; + if (root1.value != root2.value) + return false; + return doseTree1HaveTree2(root1.left, root2.left) && doseTree1HaveTree2(root1.right, root2.right); +} +``` + +# 27_二叉树的镜像 + +> 输入一棵二叉树,输出它的镜像。 + +遍历该树所有节点,如果有子节点,就交换子节点。 + +```java +private static void mirrorRecursively(BinaryTreeNode node) { + if (node == null) + return; + if (node.left == null && node.right == null) + return; + //交换子节点 + BinaryTreeNode tempNode = node.left; + node.left = node.right; + node.right = tempNode; + //递归交换子节点的子节点 + if (node.left != null) + mirrorRecursively(node.left); + if (node.right != null) + mirrorRecursively(node.right); +} +``` + +# 28_对称二叉树 + +> 判断一棵二叉树是不是对称的,如果一棵二叉树跟它镜像一样,那么就是对称的。 + +思路比较巧妙,二叉树的三种遍历方式都是先遍历左节点,再遍历右节点,那么可不可以定义一种遍历方式,先遍历右节点,后遍历左节点呢(刚好可以用来解决对称)?如果两种方式遍历的序列一样,那么就是镜像的,当然还需要处理特殊情况,把NULL考虑进来。 + +```java +private static boolean isSymmetrical(BinaryTreeNode node) { + return isSymmetrical(node, node); +} + +private static boolean isSymmetrical(BinaryTreeNode node1, BinaryTreeNode node2) { + if (node1 == null && node2 == null) + return true; + if (node1 == null || node2 == null) + return false; + if (node1.value != node2.value) + return false; + return isSymmetrical(node1.left, node2.right) && + isSymmetrical(node1.right, node2.left); +} +``` + +# 29_顺时针打印矩阵 + +> 输入一个矩阵,按照从外向里以顺时针依次打印出每一个数字,从左上顶点开始。 + +思路就是按照"圈数"来打印,循环打印多少圈。经过分析发现,最后一圈的第一个数字,一定在`(i,i)`上,如果`i*2> cols && i*2> rows`就结束循环。 + +对于每一圈,又分成四个步骤,从左到右打印,从上到下打印,从右到左打印,从下到上打印。 + +从左到右打印是必须的,无论是只有一行的矩阵,还是只有一列的矩阵。 + +```java +int endX = cols - 1 - start; +int endY = rows - 1 - start; +for (int i = start; i <= endX; i++) { + System.out.printf("%d->", nums[start][i]); +} +``` + +从上到下不是必须的,**如果只有一行**,那么就没有这个过程。所以从上到下的条件是`endY> start`。 + +```java +if (start < endY) { + for (int i = start + 1; i <= endY; i++) { + System.out.printf("%d->", nums[i][endX]); + } +} +``` + +从右到左也不是必须的,**如果只有一列**,那么就没有这个过程。所以从右到左的条件必须是`endY> start && endX> start`。 + +```java +if (start < endX && start < endY) { + for (int i = endX - 1; i>= start; i--) { + System.out.printf("%d->", nums[endY][i]); + } +} +``` + +最后一步从下到上也不是必须的,**如果只有两行**,那么就没有这个过程,所以条件行数必须大于2,`endX> start && endY -1> start`。 + +```java +if (start < endX && start < endY - 1) { + for (int i = endY - 1; i>= start + 1; i--) { + System.out.printf("%d->", nums[i][start]); + } +} +``` + diff --git "a/src/q27_344円272円214円345円217円211円346円240円221円351円225円234円345円203円217円/MirrorOfBinaryTree.java" "b/src/q27_344円272円214円345円217円211円346円240円221円351円225円234円345円203円217円/MirrorOfBinaryTree.java" index fb49d63..303f18b 100644 --- "a/src/q27_344円272円214円345円217円211円346円240円221円351円225円234円345円203円217円/MirrorOfBinaryTree.java" +++ "b/src/q27_344円272円214円345円217円211円346円240円221円351円225円234円345円203円217円/MirrorOfBinaryTree.java" @@ -12,19 +12,6 @@ public static void main(String[] args) { test5(); } - private static void print(BinaryTreeNode node1) { - if (node1 == null) { - System.out.println("空树!"); - return; - } - System.out.print("变换之前:"); - node1.preOrder(); - System.out.print("\n变换之后:"); - mirrorRecursively(node1); - node1.preOrder(); - System.out.println("\n============="); - } - private static void mirrorRecursively(BinaryTreeNode node) { if (node == null) return; @@ -39,6 +26,18 @@ private static void mirrorRecursively(BinaryTreeNode node) { mirrorRecursively(node.right); } + private static void print(BinaryTreeNode node1) { + if (node1 == null) { + System.out.println("空树!"); + return; + } + System.out.print("变换之前:"); + node1.preOrder(); + System.out.print("\n变换之后:"); + mirrorRecursively(node1); + node1.preOrder(); + System.out.println("\n============="); + } // 8 // 6 10 // 5 7 9 11

AltStyle によって変換されたページ (->オリジナル) /