码迷,mamicode.com
首页 > 其他好文 > 详细

遍历二叉树

时间:2021-06-08 22:35:30      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:顺序   lists   bre   turn   reac   valueof   maps   节点   value   

二叉树遍历

若将二叉树分为根节点,左子树,右子树三部分,则前中后序便对应根节点的访问次序。

1 前序遍历
先访问根节点,然后前序遍历左子树,再前序遍历右子树。

2 中序遍历
从根节点开始,先中序遍历左子树,然后访问根节点,再中序遍历右子树,整个访问次序为从左到右。

3 后序遍历
从根节点开始,从左到右,先叶子节点后中间节点的方式遍历左右子树,最后访问根节点。

4 层次遍历
从根节点开始访问,从上至下逐层遍历,同一层中,按由左到右的顺序遍历。

二叉树遍历算法实现

二叉树的前序、中序、后序、层级遍历的算法实现


@Slf4j
public class IterableTree {


	/**
	 * 按照前序遍历二叉树
	 * @param binaryTree
	 */
	public  void preOrder(BinaryTree binaryTree) {
		if (Objects.isNull(binaryTree)) {
			return;
		}
		log.info("node data is {}", binaryTree.data);
		preOrder(binaryTree.leftNode);
		preOrder(binaryTree.rightNode);
	}

	/**
	 * 按照中序遍历二叉树
	 * @param binaryTree
	 */
	public void midOrder(BinaryTree binaryTree) {
		if (Objects.isNull(binaryTree)) {
			return;
		}
		midOrder(binaryTree.leftNode);
		log.info("node data is {}", binaryTree.data);
		midOrder(binaryTree.rightNode);
	}

	/**
	 * 按照后序遍历二叉树
	 * @param binaryTree
	 */
	public void backOrder(BinaryTree binaryTree) {
		if (Objects.isNull(binaryTree)) {
			return;
		}
		backOrder(binaryTree.leftNode);
		backOrder(binaryTree.rightNode);
		log.info("node data is {}", binaryTree.data);
	}

	/**
	 * 按照层级遍历二叉树
	 * @param binaryTree
	 */
	public void deepOrder(BinaryTree binaryTree) {
		if (Objects.isNull(binaryTree)) {
			return;
		}

		int rootIndex = 1;
		Map<Integer, List<BinaryTree>> deepTreeMap = Maps.newHashMap();
		deepTreeMap.put(Integer.valueOf(rootIndex), Lists.newArrayList(binaryTree));

		// 扁平化二叉树
		for (int i = rootIndex; ;) {
			List<BinaryTree> binaryTrees = deepTreeMap.get(Integer.valueOf(i)).stream().map(tree-> Lists.newArrayList(tree.leftNode, tree.rightNode))
											  .flatMap(List::stream).filter(Objects::nonNull).collect(Collectors.toList());
			if (CollectionUtils.isEmpty(binaryTrees)) {
				break;
			}
			i++;
			deepTreeMap.put(Integer.valueOf(i), binaryTrees);
		}

		// 按由上至下,由左到右的顺序遍历
		IntStream.rangeClosed(1, deepTreeMap.size()).forEach(index -> deepTreeMap.get(Integer.valueOf(index))
											 .forEach(tree -> log.info("node data is {}", tree.data)));
	}


	@Data
	class BinaryTree<T>{
		// root data
		T data;
		BinaryTree leftNode;
		BinaryTree rightNode;

		public BinaryTree(T data, BinaryTree left, BinaryTree right) {
			this.data = data;
			this.leftNode = left;
			this.rightNode = right;
		}
	}
}

遍历二叉树

标签:顺序   lists   bre   turn   reac   valueof   maps   节点   value   

原文地址:https://www.cnblogs.com/cd-along/p/14847718.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!