二叉树
110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
输入:root = [3,9,20,null,null,15,7]
输出:true
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public int depth(TreeNode root){ if(root==null) return 0; int left=depth(root.left); if(left==-1) return -1; int right=depth(root.right); if(right==-1) return -1; if(Math.abs(left-right)>1) return -1; return 1+Math.max(left,right);
} public boolean isBalanced(TreeNode root) { return depth(root)==-1?false:true; } }
|
思路:递归
三步走:(1)明确递归函数的参数和返回值;
public int depth(TreeNode root)
(2)明确终止条件;
if(root==null) return 0;
(3)明确单层递归的逻辑。
如何判断当前传入节点为根节点的二叉树是否是平衡二叉树呢,当然是左子树高度和右子树高度相差。
分别求出左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉树了。
222. 完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^h 个节点。
输入:root = [1,2,3,4,5,6]
输出:6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public int countNodes(TreeNode root) { Queue<TreeNode> q=new LinkedList<TreeNode>(); int sum=0; if(root!=null) { q.offer(root); } else return 0; while(!q.isEmpty()){ int cnt=q.size(); sum+=cnt; for(int i=0;i<cnt;i++){ TreeNode tmp=q.peek(); q.poll(); if(tmp.left!=null){ q.offer(tmp.left); } if(tmp.right!=null){ q.offer(tmp.right); } } } return sum; } }
|
1 2 3 4 5 6 7 8 9
| class Solution { public int countNodes(TreeNode root) { if(root == null) { return 0; } return countNodes(root.left) + countNodes(root.right) + 1; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution {
public int countNodes(TreeNode root) { if(root == null) { return 0; } int leftDepth = getDepth(root.left); int rightDepth = getDepth(root.right); if (leftDepth == rightDepth) { return (1 << leftDepth) + countNodes(root.right); } else { return (1 << rightDepth) + countNodes(root.left); } }
private int getDepth(TreeNode root) { int depth = 0; while (root != null) { root = root.left; depth++; } return depth; } }
|
完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。
对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。