先序遍历也叫做先根遍历、前序遍历
,可记做根左右(二叉树父结点向下先左后右)。
首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回。
A,B,D,H,E,C,F,G
二叉树节点类TreeNode
package cn.tedu.function;
/**
* @description: 二叉树节点
* @author: zfh
* @version: 1.0
* @date: 2021/11/18 16:48:22
**/
public class TreeNode {
private Object data;
private TreeNode left;
private TreeNode right;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public TreeNode getLeft() {
return left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return right;
}
public void setRight(TreeNode right) {
this.right = right;
}
public TreeNode(Object data) {
this.data = data;
}
public TreeNode(Object data, TreeNode left, TreeNode right) {
this.data = data;
this.left = left;
this.right = right;
}
}
二叉树遍历BinaryTreeTraverse
/**
* @description:
* @author: zfh
* @version: 1.0
* @date: 2021/11/18 16:50:31
**/
public class BinaryTreeTraverse {
public static void main(String[] args) {
//1.构建节点
TreeNode a = new TreeNode("A");
TreeNode b = new TreeNode("B");
TreeNode c = new TreeNode("C");
TreeNode d = new TreeNode("D");
TreeNode e = new TreeNode("E");
TreeNode f = new TreeNode("F");
TreeNode g = new TreeNode("G");
TreeNode h = new TreeNode("H");
//2.添加关系
a.setLeft(b);
a.setRight(c);
b.setLeft(d);
b.setRight(e);
c.setLeft(f);
c.setRight(g);
d.setLeft(h);
//3.调用遍历方法
preTraverse(a);
}
/**
* 前序遍历
* @param curNode 当前节点
*/
public static void preTraverse(TreeNode curNode){
if(curNode != null){
System.out.println(curNode.getData());
preTraverse(curNode.getLeft());
preTraverse(curNode.getRight());
}
}
}
中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历。在二叉树中,中序遍历首先遍历左子树,然后访问根节点,最后遍历右子树,可记做左根右(二叉树先左次根后右)。
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回,否则:
(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
H -> D -> B -> E -> A -> F -> C -> G
/**
* 中序遍历
* H -> D -> B -> E -> A -> F -> C -> G
* @param curNode 当前节点
*/
public static void midTraverse(TreeNode curNode){
if(curNode != null){
midTraverse(curNode.getLeft());
System.out.println(curNode.getData());
midTraverse(curNode.getRight());
}
}
后序遍历(LRD也叫做后根遍历,可记做左右根。在二叉树中,先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点。
后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。即:
若二叉树为空则结束返回,
否则:
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根结点
/**
* 后序遍历
* H -> D -> E -> B -> F -> G -> C -> A
* @param curNode 当前节点
*/
public static void nextTraverse(TreeNode curNode){
if(curNode != null){
nextTraverse(curNode.getLeft());
nextTraverse(curNode.getRight());
System.out.println(curNode.getData());
}
}