import java.util.Stack;
/**
* 循环遍历二叉树
* @author
*
*/
public class BinaryTree {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode (){}
public TreeNode (int val) {
this.val = val;
}
}
/**
* 循环先序遍历二叉树
* @param root
*/
public static void preOrder(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode tmp = root;
while(tmp != null || !stack.isEmpty()) {
while(tmp != null) {
System.out.println(tmp.val);
stack.push(tmp);
tmp = tmp.left;
}
if(!stack.isEmpty()) {
TreeNode pop = stack.pop();
tmp = pop.right;
}
}
}
/**
* 循环中序遍历二叉树
* @param root
*/
public static void inOrder(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode tmp = root;
while(tmp != null || !stack.isEmpty()) {
while(tmp != null) {
stack.push(tmp);
tmp = tmp.left;
}
if(!stack.isEmpty()) {
TreeNode pop = stack.pop();
System.out.println(pop.val);
tmp = pop.right;
}
}
}
/**
* 循环后序遍历二叉树
* @param root
*/
public static void postOrder(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
boolean tag = true;
TreeNode preNode = null; // 前驱节点
while (!stack.isEmpty() && tag == true) {
root = stack.peek();
if (root.right == preNode) { // 之前访问的为空节点或是栈顶节点的右子节点
root = stack.pop();
System.out.println(root.val);
if (stack.isEmpty()) {
return;
} else {
preNode = root;
}
} else {
root = root.right;
tag = false;
}
}
}
}
public static void main(String[] args) {
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node5 = new TreeNode(5);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node2.right = node5;
// preOrder(node1);
// inOrder(node1);
postOrder(node1);
}
}
java实现循环遍历二叉树
最新推荐文章于 2024-08-21 23:51:34 发布