26 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
classSolution {
public booleanisSubStructure(TreeNodeA, TreeNodeB) {
if(A==null||B==null)
returnfalse;
return helper(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);//递归判断是否有子树和B一样
}
//判断两树根节点值是否相等
public booleanhelper(TreeNodeA,TreeNodeB){
if(B==null)//递归终止条件:B遍历完了
returntrue;
if(A==null)
returnfalse;
else
return helper(A.left,B.left)&&helper(A.right,B.right)&&(A.val==B.val);
}
}
27 二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
例如输入:
4
/ \ 2 7 / \ / \1 3 6 9镜像输出:
4
/ \ 7 2 / \ / \9 6 3 1
方法一思路:递归地交换二叉树每个节点的左右节点
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNodemirrorTree(TreeNode root) {
if(root==null)//递归终止条件,节点root为空
return null;
TreeNode tmpLeft=root.left;//暂存左节点(不暂存的话,左节点和右节点发生了变化,不再是原来的左节点)
root.left=mirrorTree(root.right);
root.right=mirrorTree(tmpLeft);
return root;
}
}
28 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
思路:递归判断两节点① Left. left 和 Right. right是否对称,②Left. right和Right. left是否对称,①②都满足时才是对称树。注意:节点对应的值也要相等
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
classSolution {
public booleanisSymmetric(TreeNode root) {
if(root==null)
return true;
return Compare(root.left,root.right);
}
public booleanCompare(TreeNode Left,TreeNode Right){
if(Left==null&&Right==null)
return true;
else if(Left!=null&&Right!=null){
if(Compare(Left.left,Right.right)&&Compare(Left.right,Right.left)&&Left.val==Right.val)
return true;
}
return false;
}
}