[leetcode]第 7 天 搜索与回溯算法(简单)
26. 树的子结构
思路
不知道。。看大佬的题解
流程:
- 先判断B是不是以A节点为根节点的一个子树
如果不是,判断B是否是A左右子树的一个子结构 - isSubTree(Ta, Tb)
判断Tb是否是以Ta为根节点的子树
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
// 先判断特殊情况
if(A == null || B == null){
return false;
}
// 判断是否是以A为根节点的一个子树
if(isSubTree(A, B)){
return true;
}
if(isSubStructure(A.left, B) || isSubStructure(A.right, B)){
return true;
}
return false;
}
public boolean isSubTree(TreeNode Ta, TreeNode Tb){
// 判断一下B的节点是不是已经检查完了
if(Tb == null){
return true;
}
if(Ta == null){
return false;
}
if(Ta.val != Tb.val){
return false;
}
return isSubTree(Ta.left, Tb.left) && isSubTree(Ta.right, Tb.right);
}
}
27. 二叉树的镜像
思路
用递归的话要先保存左右子节点,然后进行交换
class Solution {
public TreeNode mirrorTree(TreeNode root) {
if (root == null) return null;
TreeNode leftRoot = mirrorTree(root.right);
TreeNode rightRoot = mirrorTree(root.left);
root.left = leftRoot;
root.right = rightRoot;
return root;
}
}
28. 对称的二叉树
思路
对于树中任意两个对称节点L和R:
L.val = R.val
L.left.val = R.left.val
L.right.val = R.right.val
class Solution {
public boolean isSymmetric(TreeNode root) {
return root == null ? true : recur(root.left, root.right);
}
boolean recur(TreeNode L, TreeNode R) {
if(L == null && R == null) return true;
if(L == null || R == null || L.val != R.val) return false;
return recur(L.left, R.right) && recur(L.right, R.left);
}
}
递归,需要想清楚结束条件、递归条件。