Leetcode之二叉树

二叉树

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
//迭代法,不高效 O(n),O(n)
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);
}
//sum++;
}
}
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 {
/**
* 针对完全二叉树的解法
*
* 满二叉树的结点数为:2^depth - 1
*/
public int countNodes(TreeNode root) {
if(root == null) {
return 0;
}
int leftDepth = getDepth(root.left);
int rightDepth = getDepth(root.right);
if (leftDepth == rightDepth) {// 左子树是满二叉树
// 2^leftDepth其实是 (2^leftDepth - 1) + 1 ,左子树 + 根结点
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来计算。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!