二叉树的前序遍历,中序遍历,后序遍历的迭代方法。
//中序遍历
public static void midVisit(BTNode root){
Stack<BTNode> stack=new Stack<>();
while(!stack.isEmpty()||root!=null){
while(root!=null){
stack.add(root);
root=root.left;
}
root=stack.pop();
System.out.print(root.value+"->");
root=root.right;
}
}
//前序遍历
public static void preVisit(BTNode root){
Stack<TreeNode> stack = new Stack<>();
while(root != null || stack.size() > 0) {
while(root != null) {
if(root.right != null) {
stack.add(root.right);
}
System.out.println(root.val);
root = root.left;
}
if(stack.size() > 0) {
root = stack.pop();
}
}
}
//后续遍历
public static void postVisit(BTNode root){
Stack<BTNode> stack=new Stack<>();
if(root==null)return;
BTNode currentNode=root;
BTNode preNode=null;//用来记录上次一访问的节点
while(!stack.isEmpty()||currentNode!=null){
while(currentNode!=null){
stack.add(currentNode);
currentNode=currentNode.left;
}
if(!stack.isEmpty()){
currentNode=stack.pop();
if(currentNode.right==null||currentNode.right==preNode){//如果该节点的右子节点为空或者上一次访问的是当前节点的右子节点则访问当前节点
System.out.print(currentNode.value+"->");//访问当前节点
preNode=currentNode;//重置上次访问节点
currentNode=null;//此操作为的是下次迭代可以跳过出栈操作,而进入出栈操作
}else{
stack.add(currentNode);//将弹出来的元素重新入栈
currentNode=currentNode.right;//重置当前节点
}
}
}
}