一、非递归前序遍历
规则:中、左、右
基本思想:首先申请一个空栈,将root节点压入栈中,然后弹出root节点,将root节点的右子树(判断右子树是否存在)压入栈中,然后将左子树(判断左子树是否存在)压入栈中,再弹出左子树,重复上面的步骤,直到栈为空为止。
public void nonRecpreOrder(TreeNode1 Node){
if(Node == null){
return ;
}
Stack<TreeNode1> stack = new Stack<TreeNode1>();
stack.push(Node);
while(!stack.empty()){
TreeNode1 n = stack.pop();
System.out.println("Data"+ n.data);
if(n.rightChild != null){
stack.push(n.rightChild);
}
if(n.leftChild != null){
stack.push(n.leftChild);
}
}
}
二、非递归中序遍历
规则:左、中、右
基本思路:创建一个空栈,首先,将root节点压入栈中,(判断root是否存在子节点)将root节点的左子节点压入栈中,再将左子节点的左子节点压入栈中,直到左子节点为null,此时弹出一个节点,并判断其是否有右子节点,若有,则将该节点的右子节点压入栈中,重复上述过程。若无右子节点,则将继续弹出下一个节点,并判断其是否有右子节点。
public void nonRecmidOrder(TreeNode1 Node){
if(Node == null){
return ;
}
Stack<TreeNode1> stack = new Stack<>(); //创建一个新栈
stack.push(Node); //将根节点放入栈中
while(!stack.empty()){
if(Node.leftChild != null){ //不断地遍历做左儿子
Node = Node.leftChild;
stack.push(Node);
}
else
{
TreeNode1 n = stack.pop();
System.out.println("Data"+ n.data);
if(n.rightChild != null){ //避免空指针
Node = n.rightChild;
stack.push(Node);
}
}
}
}
三、非递归后序遍历
规则:左、右、中
基本思路:申请两个栈,将root节点压入栈S1,然后弹出该节点,并将其压入S2栈,同时把该节点的左子节点、右子节点压入栈S1,再从栈S1中弹出一个节点,重复上述操作。最后,依次弹出并打印栈S2中内容,即为后序遍历结果。
public void nonlastOrder(TreeNode1 Node){
Stack<TreeNode1> stack1 = new Stack<>();
Stack<TreeNode1> stack2 = new Stack<>();
stack1.push(Node);
while(!stack1.empty()){
TreeNode1 n = stack1.pop();
stack2.push(n);
if(n.leftChild != null){
stack1.push(n.leftChild);
}
if(n.rightChild != null){
stack1.push(n.rightChild);
}
}
while(!stack2.empty()){ //打印栈stack2中内容
TreeNode1 k = stack2.pop();
System.out.println("Data is" + k.data);
}
}