递归转换循环

直接转化

简单的递归可以直接转换,如:定义简单几个变量,保存中间结果

阶乘转换-递归写法

private static int factorialByRecurision(int num) {
   if (num == 1) {
        return 1;
    }
    return num * factorialByRecurision(num - 1);
}

阶乘转换-循环写法

private static int factorialByLoop(int num) {
   int result = 1;
    for (int i = 2; i <= num; i++) {
        result *= i;
    }
    return result;
}

间接转换

对于复杂的递归,使用栈、队列保存中间结果

应用场景

树遍历算法的循环实现

使用方法一般是:

初始状态s0入栈
whle(栈不为空){
    退栈 栈顶元素赋给s
    if(s是要找的元素) 
        返回s;
    else{
        找到s的相关状态s1
        s1入栈
    }
}

二叉树遍历-递归实现

用递归实现先序遍历

public static void traversalTreeByRecursion(BinaryTreeNode root) {
  if (root == null) {
        return;
    }
    System.out.print(root.value + " ");
    traversalTreeByRecursion(root.leftNode);
    traversalTreeByRecursion(root.rightNode);
}

二叉树遍历-循环实现(栈)

public static void traversalTreeByLoop(BinaryTreeNode root) {
    Stack<BinaryTreeNode> stack = new Stack<>();
    stack.push(root);
    while (!stack.empty()) {
        BinaryTreeNode temp = stack.pop();
        System.out.print(temp.value + " ");
        if (temp.rightNode != null) {
            stack.push(temp.rightNode);
        }
        if (temp.leftNode != null) {
            stack.push(temp.leftNode);
        }
    }
}

二叉树遍历-循环实现(队列)

public static void traversalTreeByLoop2(BinaryTreeNode root) {
   Queue<BinaryTreeNode> queue = new LinkedBlockingQueue<>();
    queue.add(root);
    while (!queue.isEmpty()) {
        BinaryTreeNode temp = queue.poll();
        System.out.print(temp.value + " ");
        if (temp.leftNode != null) {
            queue.add(temp.leftNode);
        }
        if (temp.rightNode != null) {
            queue.add(temp.rightNode);
        }
    }
}

参考:
https://blog.csdn.net/Thousa_Ho/article/details/77506664