二叉树的三种遍历方式
众所周知,二叉树主要有前序遍历,中序遍历以及后序遍历这三种主要的方式,那我们就先来解释下这种遍历的含义: 1、前序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。 2、中序遍历:若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点 3、后序遍历:若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点。
树结构的思想主要就是递归,因为二叉树从根结点出发,一般有着左子树和右子树,左子树和右子树终究还是树啊,你看是不是又回到树了,这就是一个递归嘛。那么在对树进行相关操作的时候,我们当然要好好利用这个递归的特性。
前置准备:
树结构构造代码
/** * 树结构 */ public class MyTree { private MyNode root; public MyNode getRoot() { return root; } public void setRoot(MyNode root) { this.root = root; } }
MyNode结点的构造代码:
public class MyNode { // 左子节点 private MyNode lNode; // 数据域 private String data; // 右子节点 private MyNode rNode; public MyNode(MyNode lNode, String data, MyNode rNode) { this.lNode = lNode; this.data = data; this.rNode = rNode; } public MyNode() { } public MyNode getlNode() { return lNode; } public void setlNode(MyNode lNode) { this.lNode = lNode; } public String getData() { return data; } public void setData(String data) { this.data = data; } public MyNode getrNode() { return rNode; } public void setrNode(MyNode rNode) { this.rNode = rNode; } }
构造一个树结构:
MyTree tree = new MyTree(); MyNode cNode = new MyNode(null,"C",null); MyNode eNode = new MyNode(null,"E",null); MyNode fNode = new MyNode(null,"F",null); MyNode bNode = new MyNode(cNode, "B", null); MyNode dNode = new MyNode(eNode, "D", fNode); MyNode aNode = new MyNode(bNode, "A", dNode); tree.setRoot(aNode);
树结构如下:
对于上图中的树结构进行子树划分后如下图:
看图中用颜色标出来的结构,红色框中是A结点的左子树和右子树;蓝色框中的分别是结点B的左子树以及结点D的左子树和右子树;子树也是树,所以我们就可以使用递归遍历
1、前序遍历
先访问根结点,然后前序遍历左子树,再前序遍历右子树。
// 前序遍历 private static void frontSort(MyNode node) { if (node == null) { return;} System.out.println(node.getData()); // 遍历左子树 frontSort(node.getlNode()); // 遍历右子树 frontSort(node.getrNode()); }
2、中序遍历
从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点
// 中序遍历 private static void middleSort(MyNode node) { if (node == null) { return;} // 遍历左子树 middleSort(node.getlNode()); System.out.println(node.getData()); // 遍历右子树 middleSort(node.getrNode()); }
3、后序遍历
从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点
// 后序遍历 private static void postSort(MyNode node) { if (node == null) { return;} // 遍历左子树 postSort(node.getlNode()); // 遍历右子树 postSort(node.getrNode()); System.out.println(node.getData()); }
下一篇:
关于CRC校验的一些总结