版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33861603/article/details/88494759
二叉树的应用很广,比如红黑树(特殊的二叉树),数据库的B+tree,以及一些压缩算法
这里只介绍简单的二叉树:
特征:一.一个根节点
二.众多子节点,每个节点最多有两个子节点
二叉树遍历方式:总体有两种,分别基于DFS(深度优先搜索)和BFS(广度优先搜索)的,前者包括递归(先序、中序、后序)和Stack(栈),后者是队列实现的层序遍历。
####树节点类如下
public class TreeNode {
private int data;
private TreeNode left;
private TreeNode right;
public TreeNode(int data,TreeNode left,TreeNode right) {
this.data = data;
this.left = left;
this.right = right;
}
public int getData() {
return data;
}
public TreeNode getLeft() {
return left;
}
public TreeNode getRight() {
return right;
}
}
#####模拟的二叉树形态如下
#####模拟数据如下
//返回根节点
public static TreeNode init() {
TreeNode node8 = new TreeNode(8,null,null);
TreeNode node4 = new TreeNode(4,null,null);
TreeNode node2 = new TreeNode(2,null,null);
TreeNode node7 = new TreeNode(7,null,node8);
TreeNode node5 = new TreeNode(5,node4,null);
TreeNode node1 = new TreeNode(1,null,node2);
TreeNode node9 = new TreeNode(9,node7,null);
TreeNode node3 = new TreeNode(3,node1,node5);
TreeNode node6 = new TreeNode(6,node3,node9);
return node6;
}
一。递归式(DFS)
前序递归遍历算法:访问根结点-->递归遍历根结点的左子树-->递归遍历根结点的右子树
中序递归遍历算法:递归遍历根结点的左子树-->访问根结点-->递归遍历根结点的右子树
后序递归遍历算法:递归遍历根结点的左子树-->递归遍历根结点的右子树-->访问根结点
1.前序遍历
/**
* 递归式先序遍历 根节点-->递归根节点左子树-->递归根节点右子树
* 输出结果631254978
* 6是根节点
* @param node
*/
public static void preOrder(TreeNode node) {
System.out.println(node.getData());
if(null!=node.getLeft()) {
preOrder(node.getLeft());
}
if(null!=node.getRight()) {
preOrder(node.getRight());
}
}
先序遍历输出结果:有时间画图具体描述输出顺序总结。。。。。。
2.中序遍历
/**
* 递归式中序遍历 递归根节点左子树-->访问根节点-->递归根节点右子树
* 输出结果123456789
* @param node
*/
public static void midOrder(TreeNode node) {
if(null!=node.getLeft()) {
midOrder(node.getLeft());
}
System.out.println(node.getData());
if(null!=node.getRight()) {
midOrder(node.getRight());
}
}
中序遍历输出结果:有时间画图具体描述输出顺序总结。。。。。。
3.后序遍历
/**
* 递归式后序遍历 递归根节点左子树-->递归根节点右子树-->访问根节点
* 输出结果214538796
* @param node
*/
public static void lastOrder(TreeNode node) {
if(null!=node.getLeft()) {
lastOrder(node.getLeft());
}
if(null!=node.getRight()) {
lastOrder(node.getRight());
}
System.out.println(node.getData());
}
后序遍历输出结果:有时间画图具体描述输出顺序总结。。。。。。
二。非递归式(DFS)