package basic.dataStructure.binaryTree;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class BinaryTreeUtil {
/**
* 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试
*
* @param root
* @return
*/
public static <T> List<T> preOrderVisit(BinaryTreeNode<T> root) {
List<T> result = new ArrayList<T>();
preOrder(root, result);
return result;
}
private static <T> void preOrder(BinaryTreeNode<T> tree, List<T> result){
if(tree == null) return;
result.add(tree.getData());
preOrder(tree.getLeft(), result);
preOrder(tree.getRight(), result);
}
/**
* 用递归的方式实现对二叉树的中遍历
*
* @param root
* @return
*/
public static <T> List<T> inOrderVisit(BinaryTreeNode<T> root) {
List<T> result = new ArrayList<T>();
inOrder(root, result);
return result;
}
private static <T> void inOrder(BinaryTreeNode<T> tree, List<T> result){
if(tree == null) return;
inOrder(tree.getLeft(), result);
result.add(tree.getData());
inOrder(tree.getRight(), result);
}
/**
* 用递归的方式实现对二叉树的后遍历
*
* @param root
* @return
*/
public static <T> List<T> postOrderVisit(BinaryTreeNode<T> root) {
List<T> result = new ArrayList<T>();
postOrder(root, result);
return result;
}
private static <T> void postOrder(BinaryTreeNode<T> tree, List<T> result){
if(tree == null) return;
postOrder(tree.getLeft(), result);
postOrder(tree.getRight(), result);
result.add(tree.getData());
}
/**
* 用非递归的方式实现对二叉树的前序遍历
* @param root
* @return
*/
public static <T> List<T> preOrderWithoutRecursion(BinaryTreeNode<T> root) {
List<T> result = new ArrayList<T>();
Stack<BinaryTreeNode> buffer = new Stack();
BinaryTreeNode<T> tmp = root;
while(tmp != null){
//遍历这一排的左边节点,右边节点入栈缓存
BinaryTreeNode<T> node = tmp;
while(node != null){
result.add(node.getData());
if(node.getRight() != null) buffer.add(node.getRight());
node = node.getLeft();
}
//遍历右边
//栈中没有节点则表示遍历结束
if (buffer.isEmpty()) break;
tmp = buffer.pop();
}
return result;
}
/**
* 用非递归的方式实现对二叉树的中序遍历
* @param root
* @return
*/
public static <T> List<T> inOrderWithoutRecursion(BinaryTreeNode<T> root) {
List<T> result = new ArrayList<T>();
Stack<BinaryTreeNode> buffer = new Stack<BinaryTreeNode>();
BinaryTreeNode<T> tmp = root;
while (tmp != null || !buffer.isEmpty()){
while(tmp != null){
buffer.push(tmp);
tmp = tmp.getLeft();
}
tmp = buffer.pop();
result.add(tmp.getData());
tmp = tmp.getRight();
}
return result;
}
}