最近在复习数据结构相关的知识,并准备用Java撸一下常见的数据结构算法。先从简单的开始,分享一下二叉树的三种遍历方式。先简单的介绍一下三种遍历方式(Java编程实现在文末):
1.前序遍历
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
若二叉树为空则结束返回,否则:
(1)访问根结点。
(2)前序遍历左子树。
(3)前序遍历右子树 。
需要注意的是:遍历左右子树时仍然采用前序遍历方法。
如右图所示二叉树
前序遍历结果:ABDECF
2.中序遍历
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回,否则:
(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
如右图所示二叉树,中序遍历结果:DBEAFC
注意:中序遍历是使用最多的,可以发现,在查找二叉树中,将树的各节点投影到一条直线上时,中序遍历的结果就是查找树从小到大查找所使用的算法。如下图
3.后序遍历
后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。即:
若二叉树为空则结束返回,
否则:
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根结点
如右图所示二叉树
后序遍历结果:DEBFCA
4.Java代码实现(递归方式)
/**
* @author xinx
* @date 2020/5/14 14:45
*/
@Data
@AllArgsConstructor
public class TreeNode {
public int data;
public TreeNode lNode;
public TreeNode rNode;
/**
* 前序遍历:
* @param node
*/
public static void preOrder(TreeNode node){
if (null != node){
System.out.println(node.getData());
preOrder(node.lNode);
preOrder(node.rNode);
}
}
/**
* 中序遍历
* @param node
*/
public static void inOrder(TreeNode node){
if (null != node){
inOrder(node.lNode);
System.out.println(node.data);
inOrder(node.rNode);
}
}
/**
* 后序遍历
* @param node
*/
public static void postOrder(TreeNode node){
if (null != node){
postOrder(node.lNode);
postOrder(node.rNode);
System.out.println(node.data);
}
}
public static void main(String[] args) {
TreeNode llNode1 = new TreeNode(1, null, null);
TreeNode lrNode1 = new TreeNode(3, null, null);
TreeNode lNode1 = new TreeNode(2, llNode1, lrNode1);
TreeNode rlNode1 = new TreeNode(5, null, null);
TreeNode rrNode1 = new TreeNode(7, null, null);
TreeNode rNode1 = new TreeNode(6, rlNode1, rrNode1);
TreeNode node1 = new TreeNode(4, lNode1, rNode1);
TreeNode llNode2 = new TreeNode(9, null, null);
TreeNode lrNode2 = new TreeNode(11, null, null);
TreeNode lNode2 = new TreeNode(10, llNode2, lrNode2);
TreeNode rlNode2 = new TreeNode(13, null, null);
TreeNode rrNode2 = new TreeNode(15, null, null);
TreeNode rNode2 = new TreeNode(14, rlNode2, rrNode2);
TreeNode node2 = new TreeNode(12, lNode2, rNode2);
TreeNode node = new TreeNode(8, node1, node2);
System.out.println("=============前序遍历=============");
preOrder(node);
System.out.println("=============中序遍历=============");
inOrder(node);
System.out.println("=============后序遍历=============");
postOrder(node);
}
}