标签:顺序 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