BFS(非递归实现)通过LinkedList充当队列-java

大体思路:

1.思路:

  1. 构建一个TreeNode对象,存储对应的值和孩子节点(如果只是二叉树,则只需要有TreeNode left,TreeNode right;如果为多叉树,可以使用ArrayList来存储孩子节点),初始在LinkedList中加入根节点。
  2. 遍历队列中的值(使用isEmpty函数查看LinkedList中是否为空),将当前队列中的最先进入的元素Parent取出(remove函数),加入到ArrayList(层序遍历的容器)。然后遍历Parent他的孩子节点(记得提前判断孩子节点是否为空)。
  3. 每当遍历一个孩子节点,则把孩子加入到队列LinkedLlist中。然后重复2,3两步,直到队列为空。
  4. 最终循环完毕后,ArrayList存储的值就是层次遍历后的顺序。

2.数据结构:

  1. 使用到LinkedList来实现队列。(使用remove函数移除值)
  2. 层次顺序存储在ArrayList对象中。

3.代码:

节点类:

class TreeNode{
	int value;
	TreeNode left;
	TreeNode right;
	
	public TreeNode() {
		
	}

	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		this.value = value;
	}

	public TreeNode getLeft() {
		return left;
	}

	public void setLeft(TreeNode left) {
		this.left = left;
	}

	public TreeNode getRight() {
		return right;
	}

	public void setRight(TreeNode right) {
		this.right = right;
	}
	
}

BFS方法

public static ArrayList<TreeNode> bfsMethod(TreeNode root){
		/*
		 * 输入数据结构:LinkedList,ArrayList
		 * 1.在java中队列使用到LinkedList来实现队列,BFS要使用到队列来实现,
		 * 2.层次顺序存储在ArrayList对象中
		 */
		LinkedList<TreeNode> queue = new LinkedList<>();
		ArrayList<TreeNode> bfs = new ArrayList<>();
		queue.add(root);
		while(!queue.isEmpty()) {
			TreeNode parent = queue.remove();//remove是先进先删(这和队列的删除方式如出一辙)
			bfs.add(parent);
			if(parent.left != null) {
				queue.add(parent.left);
			}
			if(parent.right != null) {
				queue.add(parent.right);
			}
		}
		return bfs;
	}

main类

public static void main(String[] args) {
		TreeNode root = new TreeNode();
		TreeNode left = new TreeNode();
		left.setValue(2);
		TreeNode right = new TreeNode();
		right.setValue(3);
		root.setValue(1);
		root.setLeft(left);
		root.setRight(right);
		ArrayList<TreeNode> trees = bfsMethod(root);
		for(int i = 0;i < trees.size();i++) {
			System.out.print(trees.get(i).getValue());
			if(i < trees.size()-1) {
				System.out.print(" ");
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值