前序遍历:
public void preOrderTravelal(Node node) {
if (node == null) {
return;
}
System.out.println(node.data);
preOrderTravelal(node.leftNode);
preOrderTravelal(node.rightNode);
}
public void preOrderNonRecursive(Node node) {
if (node == null) {
return;
}
Stack<Node> stack = new Stack<>();
while (node != null || !stack.empty()) {
if (node != null) {
System.out.println(node.data);
if (node.rightNode != null) {
stack.push(node.rightNode);
}
node = node.leftNode;
} else {
node = stack.pop();
}
}
}
中序遍历:
public void inOrderTravelal(Node node) {
if (node == null) {
return;
}
inOrderTravelal(node.leftNode);
System.out.println(node.data);
inOrderTravelal(node.rightNode);
}
public void inOrderNonRecursive(Node node) {
if (node == null) {
return;
}
Stack<Node> stack = new Stack<>();
while (node != null || !stack.empty()) {
if (node != null) {
stack.push(node);
node = node.getLeftNode();
} else {
node = stack.pop();
System.out.println(node.data);
node = node.getRightNode();
}
}
}
后序遍历:
public void postOrderTravelal(Node node) {
if (node == null) {
return;
}
postOrderTravelal(node.leftNode);
postOrderTravelal(node.rightNode);
System.out.println(node.data);
}
//利用二叉树存储的特性大小顺序加历史节点进行判断
public void postOrderNonRecursive(Node node) {
if (node == null) {
return;
}
Stack<Node> stack = new Stack<>();
Node visited = null;
while (node != null || !stack.empty()) {
if (node != null) {
stack.push(node);
node = node.leftNode;
} else {
node = stack.pop();
//递归写的时候,出栈的时候根据栈信息来判断是否遍历右子树还是打印
//非递归需要区分这一点,这里根据历史访问节点进行区分
if (node.rightNode != null && visited != node.rightNode) {
stack.push(node);
node = node.rightNode;
} else {
visited = node;
System.out.println(node.data);
node = null;
}
}
}
}