/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int countNodes1(TreeNode root) {
return getNodesCount(root);
}
//方法一、递归遍历
private int getNodesCount(TreeNode root){
if(root==null) return 0;
//左右中,后序遍历
int leftNodesCount = getNodesCount(root.left);
int rightNodesCount = getNodesCount(root.right);
int count = leftNodesCount+rightNodesCount+1;
return count;
}
//方法二、层序遍历,利用满二叉数性质来
public int countNodes2(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;
}
//方法三、层序遍历
public int countNodes(TreeNode root) {
if(root == null){
return 0;
}
/**
* Deque双端队列
* 既可以添加到队尾,也可以添加到队首;
* 既可以从队首获取,又可以从队尾获取。
*/
Deque<TreeNode> deque = new LinkedList<>();
//add()和offer()都是向队列中添加一个元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false
deque.offer(root);
int result = 0;
while(!deque.isEmpty()){
int size = deque.size();
for(int i=0;i<size;i++){
//remove() 和 poll() 方法都是从队列中删除第一个元素,如果队列元素为空,调用remove() 的行为与 Collection 接口的版本相似会抛出异常,但是新的 poll() 方法在用空集合调用时只是返回 null。
TreeNode poll = deque.poll();
result ++ ; //记录节点数
if(poll.left!=null){
deque.offer(poll.left);
}
if(poll.right!=null){
deque.offer(poll.right);
}
}
}
return result;
}
}
222. 完全二叉树的节点个数
最新推荐文章于 2024-11-12 12:29:51 发布