一、算法思路
二叉树的遍历使用了递归的思想,根据查看元素的顺序不同,分为前中后序以及层序遍历。其中前中后序遍历又可以通过显示调用栈的方法减少调用帧的使用。层序遍历即将前中后序遍历中的调用栈换成队列。
前序遍历
:(1)访问根。(2)递归地前序遍历左子树。(3)递归地前序遍历右子树。
中序遍历
:(1)递归地中序遍历左子树。(2)访问根。(3)递归地中序遍历右子树。
后序遍历
:(1)递归地后序遍历左子树。(2)递归地后序遍历右子树。(3)访问根。
二、算法实现
二叉树的实现
package com.qianshan.tree;
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ArrayBlockingQueue;
/** Node in a binary tree. */
public class BinaryNode<E> {
private E item;
private BinaryNode<E> left;
private BinaryNode<E> right;
public BinaryNode(E item) {
this.item = item;
}
public BinaryNode(E item, BinaryNode<E> left, BinaryNode<E> right) {
this.item = item;
this.left = left;
this.right = right;
}
public E getItem() {
return item;
}
public void setItem(E item) {
this.item = item;
}
public BinaryNode<E> getLeft() {
return left;
}
public void setLeft(BinaryNode<E> left) {
this.left = left;
}
public BinaryNode<E> getRight() {
return right;
}
public void setRight(BinaryNode<E> right) {
this.right = right;
}
public boolean isLeaf(){
return (left == null) && (right == null);
}
/**PreOrder Traversal */
public String toStringPreOrder(){
String result = "";
String node = (String) item;
result += node;
if (left != null){
result += this.getLeft().toStringPreOrder();
}
if (right != null){
result += this.getRight().toStringPreOrder();
}
return result;
}
/**InOrder Traversal */
public String toStringInOrder(){
String result = "";
String node = (String) item;
if (left != null) {
result += left.toStringInOrder();
}
result += node;
if (right != null){
result += right.toStringInOrder();
}
return result;
}
/**PostOrder Traversal */
public String toStringPostOrder(){
String result = "";
String node = (String) item;
if (left != null){
result += left.toStringPostOrder();
}
if (right != null){
result += right.toStringPostOrder();
}
result += node;
return result;
}
/** Traversed pre order by stack */
public String toStringPreOrderByStack(){
String result = "";
Stack<BinaryNode> binaryNodes = new Stack<>();
binaryNodes.push(this);
while (!(binaryNodes.isEmpty())){
BinaryNode node = binaryNodes.pop();
result += node.getItem();
if (node.right != null){
binaryNodes.push(node.right);
}
if (node.left != null){
binaryNodes.push(node.left);
}
}
return result;
}
/** Level Order Traversal */
public String toStringLevelOrder(){
String result = "";
ArrayBlockingQueue<BinaryNode> binaryNodes = new ArrayBlockingQueue<BinaryNode>(10);
binaryNodes.add(this);
while(!(binaryNodes.isEmpty())){
BinaryNode node = binaryNodes.peek();
binaryNodes.remove();
result += node.item;
if (node.left != null){
binaryNodes.add(node.left);
}
if (node.right != null){
binaryNodes.add(node.right);
}
}
return result;
}
}
三、样例图示
对于图中二叉树,不同遍历次序下访问节点的次序如下表所示。
遍历次序 | 访问节点的次序 |
---|---|
前序 | AGEKLHBFICJD |
中序 | GKELAFBHCJID |
后序 | KLEGFBJCDIHA |
层序 | AGHEBIKLFCDJ |