递归解决

- 完全二叉树:子树就是一个个满二叉树
- 平衡二叉树:递归求高度,用-1判断是否平衡
This commit is contained in:
whai 2024-01-22 20:56:44 +08:00
parent f469f18748
commit 0d147db2aa
2 changed files with 121 additions and 0 deletions

View File

@ -0,0 +1,48 @@
package cn.whaifree.leetCode.Tree;
import cn.whaifree.leetCode.model.TreeNode;
import org.junit.Test;
import java.util.ArrayDeque;
import java.util.Deque;
/**
* @version 1.0
* @Author whai文海
* @Date 2024/1/21 20:36
* @注释
*/
public class LeetCode110 {
@Test
public void test() {
TreeNode treeNode = TreeNode.constructTree(new Integer[]{1,2,2,3,null,null,3,4,null,null,4});
treeNode.printTree();
System.out.println(new Solution().isBalanced(treeNode));
}
class Solution {
public boolean isBalanced(TreeNode root) {
return level(root)!=-1;
}
public int level(TreeNode root) {
if (root == null) {
return 0;
}
int leftHeight = level(root.left);
if (leftHeight == -1) {
return -1;
}
int rightDepth = level(root.right);
if (rightDepth == -1) {
return -1;
}
if (Math.abs(leftHeight - rightDepth) > 1) {
return -1;
}
return Math.max(leftHeight, rightDepth) + 1;
// return Math.abs(leftHeight - rightDepth) > 1 ? -1 : Math.max(leftHeight, rightDepth) + 1;
}
}
}

View File

@ -0,0 +1,73 @@
package cn.whaifree.leetCode.Tree;
import cn.whaifree.leetCode.model.TreeNode;
import org.junit.Test;
/**
* @version 1.0
* @Author whai文海
* @Date 2024/1/22 19:05
* @注释
*/
public class LeetCode222 {
@Test
public void test() {
TreeNode treeNode = TreeNode.constructTree(new Integer[]{1, 2, 3, 4, 5, 6});
treeNode.printTree();
System.out.println(new Solution1().countNodes(treeNode));
}
class Solution {
public int countNodes(TreeNode root) {
return inLevel(root);
}
public int inLevel(TreeNode node) {
if (node==null) return 0;
int left = inLevel(node.left) + 1;
int right = inLevel(node.right) ;
return left + right;
}
}
class Solution1 {
public int countNodes(TreeNode root) {
return inLevel(root);
}
public int inLevel(TreeNode node) {
if (node == null) {
return 0;
}
// 计算左边深度
int leftDepth = 0;
TreeNode leftNode = node.left;
while (leftNode != null) {
leftNode = leftNode.left;
leftDepth++;
}
// 计算右边深度
int rightDepth = 0;
TreeNode rightNode = node.right;
while (rightNode != null) {
rightNode = rightNode.right;
rightDepth++;
}
// 如果两变深度一样那么该树是完全二叉树
if (leftDepth == rightDepth) {
return (2 << leftDepth) - 1;
}
// 如果两边深度不一样递归左右子节点+1
return inLevel(node.right) + inLevel(node.left) + 1;
}
}
}