本文将从代码实现的视角和大家一块学习二叉树的前序、中序以及后续遍历,还没整明白的盆友们赶紧上车吧。
- 打开你的IDEA,新建一个类
BinarySearchTree
,为什么要<T extends Comparable<? extends T>>
呢?:
package com.mollychin.tree;
/**
* Created by Mollychin on 2018/4/15.
*/
public class BinarySearchTree<T extends Comparable<? extends T>> {
public static void main(String[] args) {
}
}
- 车门找到了么?接下来要干正事了。首先在
BinarySearchTree
里定义一个内部类BNode
,代码如下:
/**
* 二叉树的内部类,每一个结点的定义.
*/
private static class BNode<T> {
T element;
BNode<T> right;
BNode<T> left;
/**
* 结点类的构造函数1.
*/
BNode(T element, BNode<T> right, BNode<T> left) {
this.element = element;
this.right = right;
this.left = left;
}
/**
* 结点类的构造函数2.
*/
BNode(T element) {
this.element = element;
}
}
- 然后在
BinarySearchTree
类中加入private BNode<T> root;
用以表示该树得根节点。将二叉树得数据结构绘制完成后,接下来要考虑对它进行操作,首先是insert
操作。在此过程中便能体现出Comparable接口得强大之处了。
/**
* 插入结点.
*/
private void insert(T node) {
root = insert(node, root);
}
/**
* 插入结点的具体实现.
*/
private BNode<T> insert(T node, BNode<T> t) {
if (t == null) {
return new BNode<T>(node, null, null);
}
int compareResult = node.compareTo(t.element);
if (compareResult < 0) {
t.left = insert(node, t.left);
} else if (compareResult > 0) {
t.right = insert(node, t.right);
} else {
;
}
return t;
}
- 完成二叉树得插入操作后,接下来进行三种遍历:
/**
* 前序遍历.
*/
private static void preOrder(BNode<Integer> node) {
if (node != null) {
System.out.print(node.element + " ");
preOrder(node.left);
preOrder(node.right);
}
}
/**
* 中序遍历.
*/
private static void midOrder(BNode<Integer> node) {
if (node != null) {
midOrder(node.left);
System.out.print(node.element + " ");
midOrder(node.right);
}
}
/**
* 后序遍历.
*/
private static void postOrder(BNode<Integer> node) {
if (node != null){
postOrder(node.left);
postOrder(node.right);
System.out.print(node.element+" ");
}
}
- 然后对上述步骤进行测试:
/**
* 用以测试二叉树.
*/
public static void main(String[] args) {
int[] nodes = {4, 2, 6, 1, 3, 5, 7, 8, 10};
BinarySearchTree<Integer> tree = new BinarySearchTree<>();
// 插入结点值
for (int i = 0; i < nodes.length; i++) {
tree.insert(nodes[i]);
}
// 前序遍历结果:
System.out.println("前序遍历:");
preOrder(tree.root);
System.out.println();
// 中序遍历结果:
System.out.println("中序遍历:");
midOrder(tree.root);
System.out.println();
// 后续遍历结果:
System.out.println("后序遍历:");
postOrder(tree.root);
}
- 查看输出:
- 结构图:
完整得代码如下:
package com.mollychin.tree;
/**
* Created by Mollychin on 2018/4/15.
*/
public class BinarySearchTree<T extends Comparable<? super T>> {
/**
* 用以测试二叉树.
*/
public static void main(String[] args) {
int[] nodes = {4, 2, 6, 1, 3, 5, 7, 8, 10};
BinarySearchTree<Integer> tree = new BinarySearchTree<>();
// 插入结点值
for (int i = 0; i < nodes.length; i++) {
tree.insert(nodes[i]);
}
// 前序遍历结果:
System.out.println("前序遍历:");
preOrder(tree.root);
System.out.println();
// 中序遍历结果:
System.out.println("中序遍历:");
midOrder(tree.root);
System.out.println();
// 后续遍历结果:
System.out.println("后序遍历:");
postOrder(tree.root);
}
/**
* 前序遍历.
*/
private static void preOrder(BNode<Integer> node) {
if (node != null) {
System.out.print(node.element + " ");
preOrder(node.left);
preOrder(node.right);
}
}
/**
* 中序遍历.
*/
private static void midOrder(BNode<Integer> node) {
if (node != null) {
midOrder(node.left);
System.out.print(node.element + " ");
midOrder(node.right);
}
}
/**
* 后序遍历.
*/
private static void postOrder(BNode<Integer> node) {
if (node != null){
postOrder(node.left);
postOrder(node.right);
System.out.print(node.element+" ");
}
}
/**
* 插入结点.
*/
private void insert(T node) {
root = insert(node, root);
}
/**
* 插入结点的具体实现.
*/
private BNode<T> insert(T node, BNode<T> t) {
if (t == null) {
return new BNode<T>(node, null, null);
}
int compareResult = node.compareTo(t.element);
if (compareResult < 0) {
t.left = insert(node, t.left);
} else if (compareResult > 0) {
t.right = insert(node, t.right);
} else {
;
}
return t;
}
private BNode<T> root;
/**
* 二叉树的内部类,每一个结点的定义.
*/
private static class BNode<T> {
T element;
BNode<T> right;
BNode<T> left;
/**
* 结点类的构造函数1.
*/
BNode(T element, BNode<T> right, BNode<T> left) {
this.element = element;
this.right = right;
this.left = left;
}
/**
* 结点类的构造函数2.
*/
BNode(T element) {
this.element = element;
}
}
}