概述
实现上一篇博客中提到的二叉树的前序遍历、中序遍历、后序遍历。
层序遍历,在上一篇博客中已经实现了,需要的朋友可以参考下。
实现
前序遍历
访问顺序:根节点 -> 左子树 -> 右子树
代码实现
/**
* 前序遍历二叉树
* 访问顺序:根节点 -> 左子树 -> 右子树
* @param node 节点
* @param sb 收集遍历结果
*/
private static void preorderTraversal(BinaryTreeNode node,StringBuilder sb){
if (node==null){ // 递归结束条件
return;
}
sb.append(node.getValue()).append(" "); // 先访问根节点
preorderTraversal(node.getLeft(),sb); // 再访问根节点的左子树 左子树的访问规则和根节点的访问规则一致 所以递归调用preorderTraversal()即可
preorderTraversal(node.getRight(),sb); // 再访问根节点的右子树
}
中序遍历
访问顺序:左子树 -> 根节点 -> 右子树
/**
* 中序遍历二叉树
* 访问顺序:左子树 -> 根节点 -> 右子树
* @param node 待访问节点
* @param sb 收集遍历结果
*/
private static void inorderTraversal(BinaryTreeNode node,StringBuilder sb){
if (node==null){ // 递归结束条件
return;
}
inorderTraversal(node.getLeft(),sb);
sb.append(node.getValue()).append(" ");
inorderTraversal(node.getRight(),sb);
}
后序遍历
访问顺序:左子树 -> 右子树 -> 根节点
/**
* 后序遍历二叉树
* 访问顺序:左子树 -> 右子树 -> 根节点
* @param node 待访问节点
* @param sb 收集遍历结果
*/
private static void postorderTraversal(BinaryTreeNode node,StringBuilder sb){
if (node==null){ // 递归结束条件
return;
}
postorderTraversal(node.getLeft(),sb);
postorderTraversal(node.getRight(),sb);
sb.append(node.getValue()).append(" ");
}
测试用例
用到的BinaryTreeNode类
package com.lovehena.datastructure;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/*
* java实现一颗二叉树
* 二叉树的特点:
* 只有一个根节点。
* 每个节点左侧的节点值都是小于该节点的,右侧的节点值都是大于该节点的。
* 每个节点的子节点最多为2个(≤2,即 0或1或2)
* 如二叉树:
* 1
* 2 3
* 4 5 6 7
* */
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class BinaryTreeNode {
private int value; // 当前节点的值
private BinaryTreeNode left; // 当前节点的左子节点
private BinaryTreeNode right; // 当前节点的右子节点
/**
*
* @param value 用于构造没有左子节点、右子节点的节点
*/
public BinaryTreeNode(int value) {
this.value = value;
}
}
测试用例代码
public static void main(String[] args) {
// 构造根节点 根节点下挂左子节点、右子节点
// 左子节点、右子节点下又分别挂了自己的左子节点、右子节点 以此类推
// 一棵树就形成了
BinaryTreeNode rootNode = new BinaryTreeNode(
1,// 根节点的值
new BinaryTreeNode( // 根节点的左子节点
2,
new BinaryTreeNode(4),
new BinaryTreeNode(5)
),
new BinaryTreeNode(// 根节点的右子节点
3,
new BinaryTreeNode(6),
new BinaryTreeNode(7)
)
);
StringBuilder sb = new StringBuilder();
// 从根节点遍历 没有和根节点同级的节点所以 传rightNode为null
// 等同于这个调用 printTree(null, rootNode, sb);
levelOrderTraversal(rootNode, null, sb);
log.info("二叉树的层序遍历序列为:{}\n", sb.toString());
sb=new StringBuilder();
preorderTraversal(rootNode,sb);
log.info("二叉树的前序遍历序列为:{}\n", sb.toString());
sb=new StringBuilder();
inorderTraversal(rootNode,sb);
log.info("二叉树的中序遍历序列为:{}\n", sb.toString());
sb=new StringBuilder();
postorderTraversal(rootNode,sb);
log.info("二叉树的后序遍历序列为:{}\n", sb.toString());
}
测试用例输出
扩展
如何根据一个二叉树的前序遍历序列构建出一颗二叉树?
最后
实现前序遍历、中序遍历、后序遍历时都用到了递归的写法,如果对递归还有点陌生的朋友可以参考下我的其他几篇关于递归的博客。
好了,如果对你有帮助,欢迎点个免费的赞哦。