import java.util.*;
class TreeNode {
int val;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Test {
/**
* 1
* 2 3
* 4 # 5 6
* 7 8 # # # # # #
* 9
*
* 1
* 1 1
* 1 # # 1
* # 1 # # # # # 1
*/
private String[] treeValue = {
"1",
"1", "1",
"1", "#", "#", "1",
"#", "1", "#", "#", "#", "#", "#", "1"
};
HashMap<TreeNode, Integer> map = new HashMap<>();
// (减枝优化) 判断上层节点的时候,可能会多次判断下层的节点。用一个map来记录已经判断过的节点,当要重复访问某个子节点时,直接返回当前节点的最大深度。
private int height(TreeNode node) {
if(node == null) {
return 0;
} else {
Integer max = map.get(node);
if(max == null) {
max = Math.max(height(node.left) + 1, height(node.right) + 1);
map.put(node, max);
}
return max;
}
}
public boolean isBalanceTree(TreeNode node) {
if(node == null) {
return true;
}
if(isBalanceTree(node.left) && isBalanceTree(node.right)) {
return Math.abs(height(node.left) - height(node.right)) <= 1;
}
return false;
}
public TreeNode buildTree() {
LinkedList<TreeNode> queue = new LinkedList<>();
TreeNode head = new TreeNode(Integer.parseInt(treeValue[0]));
queue.offer(head);
for(int i = 1; i <= treeValue.length; i = i + 2) {
TreeNode node = queue.poll();
if(node == null) {
continue;
}
if(i < treeValue.length && !"#".equals(treeValue[i])) {
node.left = new TreeNode(Integer.parseInt(treeValue[i]));
queue.offer(node.left);
} else {
queue.offer(null);
}
if(i + 1 < treeValue.length && !"#".equals(treeValue[i + 1])) {
node.right = new TreeNode(Integer.parseInt(treeValue[i + 1]));
queue.offer(node.right);
} else {
queue.offer(null);
}
}
return head;
}
public static void main(String[] args) {
Test test = new Test();
TreeNode head = test.buildTree();
System.out.println(test.isBalanceTree(head));
}
}
平衡二叉树判断
最新推荐文章于 2023-01-04 18:48:52 发布