先序遍历
/**
* 先序遍历
* 根 左 右
*/
@Override
public List preOrderTraverse() {
List list = new ArrayList();
Deque<Node> stack = new LinkedList();
Node cursor = root; // 根节点
while (!stack.isEmpty() || cursor != null) {
// 遍历左子树
while (cursor != null) {
stack.push(cursor);
list.add(cursor.data);
cursor = cursor.leftChild;
}
// 左子树遍历完成后,出栈,在遍历右子树
if (!stack.isEmpty()) {
cursor = stack.pop();
cursor = cursor.rightChild;
}
}
return list;
}
中序遍历
/**
* 中序遍历
* 左 根 右
*/
@Override
public List inOrderTraverse() {
List list = new ArrayList();
Deque<Node> stack = new LinkedList();
Node cursor = root; // 根节点
while (!stack.isEmpty() || cursor != null) {
// 遍历左子树
while (cursor != null) {
stack.push(cursor);
cursor = cursor.leftChild;
}
// 左子树遍历完成后,出栈,在遍历右子树
if (!stack.isEmpty()) {
cursor = stack.pop();
list.add(cursor.data);
cursor = cursor.rightChild;
}
}
return list;
}
后序遍历
/**
* 后序遍历
* 左 右 根
* 遍历方式和先序遍历相同,只不过先序遍历是从左子树开始遍历的,
* 而后序遍历是从右子树开始遍历的,最后把所得到的结果翻转一下就可以了
*/
@Override
public List postOrderTraverse() {
List list = new ArrayList();
Deque<Node> stack = new LinkedList();
Node cursor = root; // 根节点
while (cursor != null || !stack.isEmpty()) {
while (cursor != null) {
stack.push(cursor);
list.add(cursor.data);
cursor = cursor.rightChild;
}
if (!stack.isEmpty()) {
cursor = stack.pop();
cursor = cursor.leftChild;
}
}
Collections.reverse(list); // 反转list
return list;
}