定义节点:
class Node{
String val;
Node left;
Node right;
public Node(String val){
this.val = val;
}
}
非递归先序遍历思路:
1.初始化栈,将根节点入栈。
2.节点出栈,若其右、左子树不为空。则右、左子树入栈。(因为栈先进后出,所以先序时候要先右子树入,再左子树入)
重复以上2操作,一直到栈为空
//非递归先序遍历
public static void PreOrder2(Node root) {
Stack<Node> stack = new Stack<>();
if (root == null) return;
stack.push(root);
while (!stack.isEmpty()) {
Node tem = stack.pop();
System.out.print(tem.val + " ");
if (tem.right != null) stack.push(tem.right);
if (tem.left != null) stack.push(tem.left);
}
}
非递归中序遍历:
1.先将根节点入栈
2.将当前节点的所有左子树入栈,直到左子树为空
3.访问栈顶元素,从栈顶元素的右子树开始,继续刚才的过程,直到栈为空即所有的节点都被访问
//非递归中序遍历思路如下:
public static void MidOrder2(Node root) {
if (root == null) return;
Node cur = root;
Stack<Node> stack = new Stack<>();
while (true) {
// 1.先将根节点入栈
// 2.将当前节点的所有左子树入栈,直到左子树为空
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
if (stack.isEmpty()) {
break;
}
//3.访问栈顶元素,从栈顶元素的右子树开始,继续刚才的过程,直到栈为空即所有的节点都被访问
Node top = stack.pop();
System.out.print(top.val + " ");
cur = top.right;
}
}
非递归后序遍历:
prev:标记最后一个被访问的节点,即下次被访问的节点的前一节点,也就是右子树。
cur:代替root节点
1.cur从root出发,循环往左找。遇到非空节点都入栈
2.获取栈顶元素判断:没有右子树,或者右子树已经被访问过,则可以访问栈顶元素
3.否则从当前栈顶元素的右子树循环第1,2,3步
//非递归后序遍历
public static void LastOrder2(Node root) {
if (root == null) return;
Node prev = null;//标记最后一个被访问的节点,即下次被访问的节点的前一节点,也就是右子树。
Node cur = root;
Stack<Node> stack = new Stack<>();
while (true) {
//1.cur从root出发,循环往左找。遇到非空节点都入栈
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
if (stack.empty()) return;
//2.获取栈顶元素值
Node top = stack.peek();
//3.没有右子树,或者右子树已经被访问过
if (top.right == null || top.right == prev) {
//则可以访问栈顶元素
System.out.print(top.val+" ");
stack.pop();
//prev记录最后一个被访问的节点,即下次被访问的节点的前一节点,也就是右子树
prev = top;
}
//否则从当前栈顶元素的右子树循环第1,2,3步
else {
cur = top.right;
}
}
}
非递归层序遍历:
和先序的思路基本一样。只是存到列表里,而且顺序是正确的
//非递归层序遍历
public static void LevalOrder(Node root){
LinkedList<Node> list = new LinkedList<>();
if(root == null)return;
list.add(root);
while (list.isEmpty() == false ) {
Node tem = list.poll();
System.out.print(tem.val+" ");
if(tem.left != null){
list.add(tem.left);
}
if(tem.right != null){
list.add(tem.right);
}
}
}