题目:100. 相同的树 - 力扣(LeetCode)
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3] 输出:true
示例 2:
输入:p = [1,2], q = [1,null,2] 输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2] 输出:false
提示:
- 两棵树上的节点数目都在范围
[0, 100]
内 -104 <= Node.val <= 104
思路:1.先判断一个为空一个不为空的情况
2.在判断两个都为空的情况
3.都不为空时,判断值是否相等
4.递归左右子树。
代码:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {//一个为空一个不为空if(p==null&&q!=null||p!=null&&q==null){return false;}//两个都为空if(p==null&&q==null){return true;}//走到这里这时两个都不为空了,判断值是否相等if(p.val!=q.val){return false;}return isSameTree(p.left ,q.left)&&isSameTree(p.right ,q.right);}
}
题目:572. 另一棵树的子树 - 力扣(LeetCode)
给你两棵二叉树 root
和 subRoot
。检验 root
中是否包含和 subRoot
具有相同结构和节点值的子树。如果存在,返回 true
;否则,返回 false
。
二叉树 tree
的一棵子树包括 tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。
示例 1:
输入:root = [3,4,5,1,2], subRoot = [4,1,2] 输出:true
示例 2:
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2] 输出:false
提示:
root
树上的节点数量范围是[1, 2000]
subRoot
树上的节点数量范围是[1, 1000]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104
思路:1.先判空,空也是false因为空也算一个节点,不确定后面有没有
2.在判断两树是否相同
3.递归判断左右子树是否相同
代码:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {//一个为空一个不为空if(p==null&&q!=null||p!=null&&q==null){return false;}//两个都为空if(p==null&&q==null){return true;}//走到这里这时两个都不为空了,判断值是否相等if(p.val!=q.val){return false;}return isSameTree(p.left ,q.left)&&isSameTree(p.right ,q.right);}public boolean isSubtree(TreeNode root, TreeNode subRoot) {if(root==null){return false;}if(isSameTree(root,subRoot)){return true;}if(isSubtree(root.left,subRoot)){return true;}if(isSubtree(root.right,subRoot)){return true;}return false;}
}
题目:226. 翻转二叉树 - 力扣(LeetCode)
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3] 输出:[2,3,1]
示例 3:
输入:root = [] 输出:[]
提示:
- 树中节点数目范围在
[0, 100]
内 -100 <= Node.val <= 100
思路:1.判空
2.交换左右子树的结点
3.递归左右子树
代码:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public TreeNode invertTree(TreeNode root) {if(root==null){return null;}TreeNode tmp=root.left;root.left=root.right;root.right=tmp;invertTree(root.left);invertTree(root.right);return root;}
}
题目:110. 平衡二叉树 - 力扣(LeetCode)
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:
输入:root = []
输出:true
提示:
- 树中的节点数在范围
[0, 5000]
内 -104 <= Node.val <= 104
思路:平衡二叉树指的是子树之间的绝对值之差小于1。
用两个方法写(高度,平衡)
高度1.判空
2.递归左右子树的高度并保存
3.判断绝对值之差是否小于1,并且递归的左右子树都要>=0
返回最大子树的高度+1.
平衡:1.判空,空也平衡
2.返回高度>0.
代码:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public int getHeight(TreeNode root){if(root==null)return 0;int leftHeight=getHeight(root.left);int righeHeight=getHeight(root.right);if(leftHeight>=0&&righeHeight>=0&&Math.abs(leftHeight-righeHeight)<=1){return Math.max(leftHeight,righeHeight)+1;}else{return -1;}}public boolean isBalanced(TreeNode root) {if(root==null){return true;}return getHeight(root)>0;}
}