剑指 Offer 26. 树的子结构
题目描述
输入两棵二叉树A和B,判断B是不是A的子结构(约定空树不是任意一个树的子结构)。B是A的子结构, 即 A中有出现和B相同的结构和节点值。
题目链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/
思路
嵌套深度优先遍历,在递归遍历A的同时,当A,B节点值相等时,调用另一个递归函数递归遍历其左右节点
实现代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A == null || B == null){ //约定空树不是任意一个树的子结构
return false;
}
//当前节点相等就遍历A,B的左右子树,左右子树都匹配成功才返回true
if(A.val == B.val){
if(isSub(A.left, B.left) && isSub(A.right, B.right)){
return true;
}
}
//不相等就就继续递归遍历A的左右节点
return isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
public boolean isSub(TreeNode root1, TreeNode root2){
if(root2 == null){ //树B已匹配完,返回true
return true;
}
if(root1 == null){ //树A先越过叶子节点,则匹配失败,返回false
return false;
}
if(root1.val == root2.val){ //节点值相等就就继续递归遍历,返回左右节点的匹配结果
return isSub(root1.left, root2.left) && isSub(root1.right, root2.right);
}else{
return false;
}
}
}
剑指 Offer 27. 二叉树的镜像
题目描述
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
思路
根据后序遍历左右中的特性,先遍历到叶子节点,再在回溯过程中交换左右节点
实现代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if(root == null){
return root;
}
TreeNode left = mirrorTree(root.left);
TreeNode right = mirrorTree(root.right);
TreeNode temp = left;
root.left = right;
root.right = temp;
return root;
}
}
剑指 Offer 28. 对称的二叉树
题目描述
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
思路
前序遍历左右子树,左子树按中左右的顺序遍历,右子树按中右左的顺序遍历,比较镜像位置的节点值是否相同
即将左子树的左节点与镜像位置的右子树的右节点进行比较,相应的左的右节点与右的左节点进行比较。
实现代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return leftAndRightTra(root.left, root.right);
}
public boolean leftAndRightTra(TreeNode left, TreeNode right){
if(left == null || right == null){
if(left == null && right == null){ //都为null,匹配,返回true
return true;
}else{ //一个为null,一个不为null,不匹配,返回false
return false;
}
}
if(left.val != right.val){ //若镜像位置的节点值不相等就返回false
return false;
}
//递归遍历,左子树先左后右,右子树先右后左
return leftAndRightTra(left.left, right.right)
&& leftAndRightTra(left.right, right.left);
}
}

京公网安备 11010502036488号