二叉树 非递归 前中后序遍历 其中root为空头节点 root.left指向真实的二叉头节点
其中前序与中序思路相同,打印节点输出位置不同,后序要防止重复进入右节点
前序:节点入栈时立即输出,
中序:先入栈,后出栈时输出,
后序:记录上一个打印输出的节点,判断右孩子与上一个输出的节点是否相同,若相同则跳过进入右孩子,输出当前节点。
前序遍历
public class DLR {
public static void dlr(TreeNode root){
TreeNode tmpNode = root.getLchild();
ArrayDeque<TreeNode> stack = new ArrayDeque<>();
System.out.println(tmpNode.getVal());
while(!stack.isEmpty()||tmpNode!=null){
while (tmpNode!=null){
System.out.println(tmpNode.getVal());
stack.push(tmpNode);
tmpNode=tmpNode.getLchild();
}
tmpNode = stack.pop();
tmpNode=tmpNode.getRchild();
}
}
}
中序遍历
public class LDR {
public static void ldr(TreeNode root){
TreeNode tmpNode = root.getLchild();
ArrayDeque<TreeNode> stack = new ArrayDeque<>();
while(!stack.isEmpty()||tmpNode!=null){
while (tmpNode!=null){
stack.push(tmpNode);
tmpNode=tmpNode.getLchild();
}
tmpNode = stack.pop();
System.out.println(tmpNode.getVal());
tmpNode = tmpNode.getRchild();
}
}
}
后序遍历
public class LRD {
public static void lrd(TreeNode root){
int flag=0;
TreeNode tmpNode = root.getLchild();
TreeNode lastNode=null;
ArrayDeque<TreeNode> stack = new ArrayDeque<>();
while (!stack.isEmpty()||tmpNode!=null){
while (tmpNode!=null){
stack.push(tmpNode);
tmpNode=tmpNode.getLchild();
}
tmpNode=stack.peek();
if (tmpNode.getRchild()!=null&&tmpNode.getRchild()!=lastNode){
tmpNode=tmpNode.getRchild();
}else{
tmpNode=stack.pop();
System.out.println(tmpNode.getVal());
lastNode=tmpNode;
tmpNode=null;
}
}
}
}