当前位置:   article > 正文

【Java--数据结构】二叉树oj题(上)

【Java--数据结构】二叉树oj题(上)

前言

欢迎关注个人主页逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



判断是否是相同的树

oj链接

要判断树是否一样,要满足3个条件

  • 结构 和 值 一样
  • 左子树的结构和值一样
  • 右子树的结构和值一样

所以就可以总结以下思路:

  1. 一个为空,一个不为空--》一定不相同
  2. 两个都为空--》                  相同
  3. 都不为空 ,但值不一样--》一定不相同
  4. 最后递归判断 左子树和右子树都要相同--》两棵树相同

其中该题的时间复杂度为O(min(m,n)),也就是取m和n中最小值(假设p的节点数为m个,q的节点数为n个)

  1. public boolean isSameTree(TreeNode p, TreeNode q) {
  2. //一个为空,一个不为空
  3. if(p!=null&&q==null||p==null&&q!=null){
  4. return false;
  5. }
  6. //此时要么两个都为空,要么都不为空
  7. if(p==null&&q==null){
  8. return true;
  9. }
  10. //都不为空
  11. if(p.val!=q.val){
  12. return false;
  13. }
  14. //此时两个都不为空,val值也一样,说明根节点相同
  15. //判断左右树是否相同
  16. return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);

另一棵树的子树

oj链接

当两颗树相同时,也属于子树

所以步骤如下

  1. 判断是不是两颗相同的树
  2. 若不是,有可能是子树的子树
  3. 也有可能是子树的子树

其中该题的时间复杂度为m*n  (假设root有n个节点,subRoot有m个节点),原因是root的每一个节点都要和subRoot的节点比对

  1. public boolean isSubtree(TreeNode root, TreeNode subRoot) {
  2. //因为root要递归,递归到后面root可能为空
  3. if(root==null){
  4. return false;
  5. }
  6. //两颗树相同时,成立
  7. if(isSameTree(root,subRoot)){
  8. return true;
  9. }
  10. //判断root的左子树和subRoot
  11. if(isSubtree(root.left,subRoot)){
  12. return true;
  13. }
  14. //判断root的右子树和subRoot
  15. if(isSubtree(root.right,subRoot)){
  16. return true;
  17. }
  18. return false;
  19. }
  20. public boolean isSameTree(TreeNode p, TreeNode q) {
  21. //一个为空,一个不为空
  22. if(p!=null&&q==null||p==null&&q!=null){
  23. return false;
  24. }
  25. //此时要么两个都为空,要么都不为空
  26. if(p==null&&q==null){
  27. return true;
  28. }
  29. //都不为空
  30. if(p.val!=q.val){
  31. return false;
  32. }
  33. //此时两个都不为空,val值也一样,说明根节点相同
  34. //判断左右树是否相同
  35. return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
  36. }

翻转二叉树

oj链接

让root的左节点和右节点交换,再递归遍历root.left和root.right使左子树和右子树都翻转。

代码优化:若只有一个根节点(左右子树都为空),直接返回;减少了递归和交换的次数

  1. public TreeNode invertTree(TreeNode root) {
  2. if(root==null){
  3. return null;
  4. }
  5. //代码优化部分******减少一些递归和交换的次数
  6. if(root.left==null&&root.right==null){
  7. return root;
  8. }
  9. // ******
  10. TreeNode ret=root.left;
  11. root.left=root.right;
  12. root.right=ret;
  13. invertTree(root.left);
  14. invertTree(root.right);
  15. return root;
  16. }

判断一颗二叉树是否是平衡二叉树

平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1

oj链接

 判断步骤:

当前root的 左子树 和 右子树的高度差<=1

同时满足root的左 右子树平衡

 其中该题的时间复杂度为O(n^2)

  1. public boolean isBalanced(TreeNode root) {
  2. if(root==null) return true;
  3. int leftH=maxDepth(root.left);
  4. int rightH=maxDepth(root.right);
  5. return Math.abs(leftH-rightH)<=1
  6. &&isBalanced(root.left)
  7. &&isBalanced(root.right);
  8. }
  9. public int maxDepth(TreeNode root){
  10. if(root==null){
  11. return 0;
  12. }
  13. int leftH=maxDepth(root.left);
  14. int rightH=maxDepth(root.right);
  15. return leftH>rightH?leftH+1:rightH+1;
  16. }

 代码优化,使得时间复杂度变为O(n)

  1. public boolean isBalanced(TreeNode root) {
  2. if(root==null) return true;
  3. return maxDepth(root)>=1;
  4. }
  5. public int maxDepth(TreeNode root){
  6. if(root==null){
  7. return 0;
  8. }
  9. int leftH=maxDepth(root.left);
  10. if(leftH<0){
  11. return -1;
  12. }
  13. int rightH=maxDepth(root.right);
  14. if(rightH<0){
  15. return -1;
  16. }
  17. if(Math.abs(leftH-rightH)<=1){
  18. return leftH>rightH?leftH+1:rightH+1;
  19. }else{
  20. return -1;
  21. }
  22. }

第三种写法

  1. public boolean isBalanced(TreeNode root) {
  2. if(root==null) return true;
  3. return maxDepth(root)>=1;
  4. }
  5. public int maxDepth(TreeNode root){
  6. if(root==null){
  7. return 0;
  8. }
  9. int leftH=maxDepth(root.left);
  10. // if(leftH<0){
  11. // return -1;
  12. // }
  13. int rightH=maxDepth(root.right);
  14. // if(rightH<0){
  15. // return -1;
  16. // }
  17. if(leftH>=0&&rightH>=0
  18. &&Math.abs(leftH-rightH)<=1){
  19. return Math.max(leftH,rightH)+ 1;
  20. }else{
  21. return -1;
  22. }
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/948657
推荐阅读
相关标签
  

闽ICP备14008679号