[路飞]_前序-中序-后序遍历

262 阅读2分钟

1,前序遍历

对于二叉树的前序遍历,只需要判断一下其左右子树是否存在,然后其余交给迭代方程即可

var preorderTraversal = function(root){
    let res = []
    if(!root) return res;
    var order = function(node) {//前序递归方程
        res.push(val);
        if(node.left){
            order(order.left)
        }
        if(node.right) {
            order(order.right)
        }
     }
     order(root)
     return res
}

N叉树前序遍历唯一的不同点在于:N叉树是一整个children节点,不能直接添加进结果递归方程中,而是要把每个children的子节点取出来,然后进行递归

var preorder = function(root){
    let inn = []
    if(!root) return inn;
    var order = function(node) {
        inn.push(node.val);
        if(node.children){
            for(let i =0;i<node.children.length;i++) {
                order(node.children[i])
            }
        }
    }
    order(root)
    return inn
}

2,中序遍历

思路分析:前,中,后序遍历都是基于DFS,每个节点都有三个不同的驻留阶段,既每个节点都会被经过三次 1,在递归他的左子树之前 2,在递归完他的左子树之后,在递归右子树之前 3,在递归完右子树之后

const inorderTraversal = function(root) {
      const inn = [];
      const inorder = (root) => {
            if (root == null) {
                  return;
            }
      inorder(root.left);
      inn.push(root.val);
      inorder(root.right);
      };
      inorder(root);
      return inn;
};

3,后序遍历

递归:递归本身就是栈后进先出的原理,通过递归从最后一个结果开始保存到数组中,实现倒序push到插入数组

var reversePrint = function (head) {
    let nums = []
    const visitor = function (head) {
        if (head !== null) {
            visitor(head.next)
            nums.push(head.val)
        }
    };
    visitor(head)
    return nums
}

最后说一下递归的三个要素

1,确认递归函数的参数和返回值:

确认那些参数是在递归过程中需要处理的,那么就在这些递归函数里加上这个参数,并且还要明确每次递归的返回值并确定递归函数的返回类型 2,确认终止条件: 写完递归算法运行的时候,经常会遇到栈溢出的错误,就是因为没写终止条件或者终止条件不对,操作系统也是有一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然会溢出 3,确认单层递归的逻级: 确认每层递归需要处理的信息,然后重复调用自己是实现递归的过程