二叉树的层序遍历原理总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40301026/article/details/88782668

层序遍历也就是从左向右一层一层的遍历,直到结束。下图是一个二叉树,并且层序去遍历

如何用代码来实现此算法?

核心:利用队列先进后出的特征,先让根结点入队,接着开始循环一下操作,出队,出队的结点左孩子,右孩子入队。直到队列为null

下图是对上面二叉树的层序遍历的描述。蓝色数字2到11则是循环的操作。红字是每次循环的具体操作。出队循序就是层序遍历的顺序。

 

 树的结点定义:

package cn.liu.BinaryTree;

/**
 * 二叉链表的结点
 * @author Administrator
 *
 */
public class Node {
	private Object data;//数据域
	private Node leftChild;//左孩子(左子树)
	private Node rightChild;//右孩子(右子树)
	
	
	public Node() {
		super();
	}
	
	public Node(Object data) {
		super();
		this.data = data;
	}
	
	

	public Node(Object data, Node leftChild, Node rightChild) {
		super();
		this.data = data;
		this.leftChild = leftChild;
		this.rightChild = rightChild;
	}

	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
	public Node getLeftChild() {
		return leftChild;
	}
	public void setLeftChild(Node leftChild) {
		this.leftChild = leftChild;
	}
	public Node getRightChild() {
		return rightChild;
	}
	public void setRightChild(Node rightChild) {
		this.rightChild = rightChild;
	}

	@Override
	public String toString() {
		return "Node [data=" + data + ", leftChild=" + leftChild + ", rightChild=" + rightChild + "]";
	}
	
}

 层序遍历:

package cn.liu.BinaryTree;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 二叉树的层序遍历
 * 思路:利用队列先进后出的特性,
 * 先让根结点入队列,对下面2步进行循环。
 * 1.队列不为null,则出队。
 * 2.若左孩子不为null,入队,若右孩子不为null,出队。
 * 最后直到队列为空
 * @author Administrator
 *
 */
public class Demo3 {
	private Node root;//根结点
	
	public Demo3(Node root) {
		super();
		this.root = root;
	}
	
	public void levelTraversal() {
		if(root == null) return ;//根为为null结束
		Queue<Node> queue = new LinkedList<>();//建立队列
		queue.offer(root);//根入队列
		System.out.println("层序遍历为:");
		while(queue.size()!=0) {
			int len = queue.size();//统计现在队列元素个数
			for(int i =0; i<len;i++) {
				Node temp = queue.poll();//出队
				System.out.print(temp.getData()+" ");
				if(temp.getLeftChild()!=null) queue.offer(temp.getLeftChild());//左孩子入队
				if(temp.getRightChild()!=null) queue.offer(temp.getRightChild());//右孩子入队
			}
		}
	}
}

 测试:

package cn.liu.BinaryTree;

public class TestDemo {
	public static void main(String[] args) {
		//创建一个二叉树
		Node node10 = new Node(10, null, null);
		Node node9 = new Node(9, null, null);
		Node node8 = new Node(8, null, null);
		Node node7 = new Node(7, null, null);
		Node node6 = new Node(6, node10, null);
		Node node5 = new Node(5, node8, node9);
		Node node4 = new Node(4, node7, null);
		Node node3 = new Node(3, null, node6);
		Node node2 = new Node(2, node4, node5);
		Node node1 = new Node(1,node2,node3);
		
		Demo3 tt = new Demo3(node1);
		tt.levelTraversal();
	}
}

 

猜你喜欢

转载自blog.csdn.net/qq_40301026/article/details/88782668