一、队列定义及实现
队列是一种操作受限的线性表,它只允许在线性表的一端进行插入操作(rear),在另一端进行删除操作(front)。Java用LinkedList类实现Queue接口,因此我们可以把LinkedList当成Queue来用。
相关方法及代码实现参见:https://blog.youkuaiyun.com/qq_36625806/article/details/78985589
二、二叉树结点数的计算(非递归算法)
二叉树结点数的计算使用Queue实现,具体实现是:先存入二叉树的根结点到队列,计数,然后删除根结点同时存入根节点的左右子结点,如此循环,直到结点为空。
代码展示(附递归算法及测试代码):
import java.util.LinkedList;
import java.util.Queue;
//定义二叉树
public class TreeNode{
int value=0; //数据域
TreeNode left=null;// 左子树根节点
TreeNode right=null;// 右子树根节点
public TreeNode() {}
public TreeNode(int value){
this.value=value;
}
public TreeNode(int vlaue,TreeNode left,TreeNode right) {
this.value=value;
this.left=left;
this.right=right;
}
//计算树的结点数量(非递归算法) 队列
public int sumOfNode(TreeNode root) {
if(root==null) {
return 0;
}
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.offer(root);
int sum=0;
while(!queue.isEmpty()){
TreeNode node=queue.poll();// 从队头位置移除
sum++;
if(node.left!=null) { // 如果有左孩子,加到队尾
queue.offer(node.left);
}
if(node.right!=null) { // 如果有右孩子,加到队尾
queue.offer(node.right);
}
}
return sum;
}
//递归算法 左子树+右子树+1
public int sumOfNodeRec(TreeNode root) {
if(root==null) {
return 0;
}
int sum=0;
int leftSum=sumOfNode(root.left);
int rightSum=sumOfNode(root.right);
return leftSum+rightSum+1;
}
//测试
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeNode node1=new TreeNode(2,new TreeNode(7),new TreeNode(8));
TreeNode btree=new TreeNode(1,node1,new TreeNode(4));
System.out.println("非递归算法: "+btree.sumOfNode(btree));
System.out.println("递归算法: "+btree.sumOfNodeRec(btree));
}
}