二叉树遍历可以使用深度优先遍历和广度优先遍历,深度优先又可以分为前序、中序、后序三种方式遍历,每种方式都可以通过递归和非递归方法实现。
一、深度优先递归遍历:
前序遍历算法:
- 先遍历根结点
- 再递归遍历左子树
- 最后递归遍历右子树
- 首先访问根结点A;
- 遍历A结点的左子树,B结点。
- B结点有子结点,再按照前序遍历方式遍历,先访问根结点,即B;
- 遍历B结点左子树,D结点;
- D结点没有子结点,遍历B结点的右子树,E结点;到此,B结点的根结点、左子树、右子树、已经遍历完成;
- 遍历A结点的右子树,C结点;
- C结点有子结点,再按照前序遍历方式遍历,先访问根结点,即C;
- 遍历C结点左子树,F结点;
- F结点没有子结点,遍历C结点的右子树,G结点;到此,C结点的根结点、左子树、右子树、已经遍历完成;
最终的访问顺序为:A->B->D->E->C->F->G
代码实现:
结点类:
//结点
public class TreeNode{
private String data;
private TreeNode left;
private TreeNode right;
public TreeNode(String data,TreeNode left,TreeNode right){
this.data = data;
this.left = left;
this.right = right;
}
}
递归实现前序遍历二叉树:
private List<String> list = new ArrayList<String>();
//前序遍历
public List<String> preTreeNode(TreeNode node){
list.add(node.data);
if(node.left != null)
preTreeNode(node.left);
if(node.right != null)
preTreeNode(node.right);
return list;
}
中序遍历算法:
- 先递归遍历的左子树
- 再遍历根节点
- 最后递归遍历右子树
- 首先访问根结点A的左子树B;
- B结点有子结点,访问B结点的左子树,D;
- D没有子结点,遍历D结点;
- 返回遍历B结点;
- 遍历E结点;
- 至此,以B为根节点的部分遍历完成,返回遍历A结点部分;
- 遍历A结点;
- 访问C结点,C结点有子结点,访问C结点的左子树,F;
- F没有子结点,遍历F结点;
- 返回遍历C结点;
- 遍历C结点的右子树,G结点;
最终遍历顺序:D->B->E->A->F->C->G
代码实现:
结点类:
//结点
public class TreeNode{
private String data;
private TreeNode left;
private TreeNode right;
public TreeNode(String data,TreeNode left,TreeNode right){
this.data = data;
this.left = left;
this.right = right;
}
}
递归实现中序遍历二叉树:
//中序遍历
public List<String> inTreeNode(TreeNode node){
if(node.left != null){
preTreeNode(node.left);
}
list.add(node.data);
if(node.right != null){
preTreeNode(node.right);
}
return list;
}
后序递归遍历算法:
- 先递归遍历的左子树
- 再递归遍历右子树
- 最后遍历根节点
- 首先访问根结点A的左子树B;
- B结点有子结点,访问B结点的左子树,D;
- D没有子结点,遍历D结点;
- 遍历E结点;
- 遍历B结点;
- 至此,以B为根节点的部分遍历完成,返回遍历A结点部分;
- 访问C结点,C结点有子结点,访问C结点的左子树,F;
- F没有子结点,遍历F结点;
- 遍历G结点;
- 遍历C结点;
- 至此,以C为根节点的部分遍历完成,返回遍历A结点部分;
- 遍历A结点;
最终遍历顺序:D->E->B->F->G->C->A
代码实现:
结点类:
//结点
public class TreeNode{
private String data;
private TreeNode left;
private TreeNode right;
public TreeNode(String data,TreeNode left,TreeNode right){
this.data = data;
this.left = left;
this.right = right;
}
}
递归实现后序遍历二叉树:
//后序遍历
public List<String> inTreeNode(TreeNode node){
if(node.left != null){
preTreeNode(node.left);
}
if(node.right != null){
preTreeNode(node.right);
}
list.add(node.data);
return list;
}
待续…
来源:CSDN
作者:chenyi406
链接:https://blog.csdn.net/chenyi406/article/details/103596221