博客主页:敲代码的布莱恩特
欢迎点赞 收藏 ⭐留言 欢迎讨论!
本文由 【敲代码的布莱恩特】 原创,首发于 CSDN
由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!✨
精品专栏(不定时更新)【JavaSE】 【Java数据结构】【LeetCode】
前中后序 遍历 其实方法都一样,就是把节点的访问顺序变一下,代码都一模一样,只是换顺序罢了
思路: 本题要求将遍历到的节点放入一个List中返回
实现代码:
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if(root==null){//根节点空
return list;//直接返回顺序表
}
list.add(root.val);//将当前访问的根节点的值存入顺序表
preorderTraversal(root.left);//访问左节点
preorderTraversal(root.right);//访问右节点
return list;
}
}
题目:
思路: 本题要求将遍历到的节点放入一个List中返回
实现代码:
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
if(root==null){//判断当前根节点是否为空
return list;
}
inorderTraversal(root.left);//访问左孩子节点
list.add(root.val);//将当前访问的根节点的值存入顺序表
inorderTraversal(root.right);//访问右孩子节点
return list;
}
}
思路: 本题要求将遍历到的节点放入一个List中返回
实现代码:
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {
if(root==null){//判断根节点是否为空
return list;
}
postorderTraversal(root.left);//访问左孩子节点
postorderTraversal(root.right);//访问右孩子节点
list.add(root.val);//将当前访问的根节点的值存入顺序表
return list;
}
}
根节点是否为空
,如果两棵树的根节点都是空,那这两棵树相同,直接返回true;只有一棵树的根节点为空
,另一棵树的根节点不为空,那这两棵树必不相同,直接返回false根节点都不为空,那就比较其值
,如果值不一样,两棵树就不相同,返回false两棵树的根节点都相同
,那么就用 递归
去判断他们的左右孩子节点是否相同
,进行套娃,即可实现代码:
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
//2个都为空
if(p == null && q == null) {
return true;
}
//只有一个不为空
if(p == null || q == null) {
return false;
}
//都不为空
if(p.val != q.val) {
return false;
}
//p和q不为空 且对应的值 是相同的 那么去判断两棵树的左树和右树
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
}
思路:
判断是否是相同树的方法
(参考上一题,实现代码一模一样)实现代码:
class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if (subRoot == null) return true; //另一棵树的根节点是空,则肯定是当前树的子树
if (root == null) return false; //当前树的根节点是空,则另一棵树肯定不是它的子树
return isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot)||isSameTree(root,subRoot);//没往下走一个节点,都要判断一次当前根节点代表的树是否和另一棵树是相同树
}
public boolean isSameTree(TreeNode s, TreeNode t) {
if (s == null && t == null) return true;//都为空
if (s == null || t == null) return false;//有一个不为空
if(s.val!=t.val) return false;//值不同,返回false
//值都相同,继续下一个节点的判断
return isSameTree(s.left, t.left) && isSameTree(s.right, t.right);
}
}
思路:
最大深度=左子树深度>右子树深度?左子树深度:右子树深度
返回的时候要+1,因为根节点也算一层
实现代码:
class Solution {
public int maxDepth(TreeNode root) {
if(root==null){//如果根节点空,返回0
return 0;
}
int a=maxDepth(root.left);//求左子树高度
int b=maxDepth(root.right);//求右子树高度
return (a > b ? a : b )+ 1;//递归公式
}
}
思路:
绝对值不超过 1
。实现代码:
class Solution {
public boolean isBalanced(TreeNode root) {
if(height(root)>=0)
return true;
else
return false;
}
//从下往上看
public int height(TreeNode root) {
if (root == null) //根节点空,返回0
return 0;
int left = height(root.left);//获得左节点高度
if(left == -1)
return -1;
int right = height(root.right);//获得右节点高度
if(right == -1)
return -1;
return Math.abs(left - right) <=2 ? Math.max(left, right) + 1 : -1;
//如果左子树和右子树高度差绝对值不大于1,返回子树的高度,否则返回-1
}
}
思路:
实现代码:
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null){
return false;
}
return isSame(root.left,root.right);//左右子树符合镜像条件,则是镜像二叉树
}
public boolean isSame(TreeNode a,TreeNode b){
if(a == null && b ==null)
return true;
if(a == null || b ==null)
return false;
if(a.val != b.val)
return false;
//关键在于最后一行代码
//左子树的左孩子值 要等于 右子树的右孩子值
//左子树的右孩子值 要等于 右子树的左孩子值
return isSame(a.left,b.right)&&isSame(a.right,b.left);
}
}
❤原创不易,如有错误,欢迎评论区留言指出,感激不尽❤
❤ 如果觉得内容不错,给个三连不过分吧~ ❤
❤ 看到会回访~ ❤