AILINGANGEL / algorithm

常见算法解析
0 stars 0 forks source link

二叉树的遍历 #3

Open AILINGANGEL opened 5 years ago

AILINGANGEL commented 5 years ago

先序遍历

var preorderTraversal = function(root) {
    let ans = [];
    helper(root, ans);
    return ans;
};
var helper = function(root, arr) {
    if (root) {
        arr.push(root.val); //先把根节点的值加入到结果集中
        helper(root.left, arr);//把左孩子的值加入到结果集中
        helper(root.right, arr);//把右边孩子的值加入到结果集中
    }
};

中序遍历

var inorderTraversal = function(root, arr) {
    if (root) {
        inorderTraversal(root.left, arr);
        arr.push(root.val);
        inorderTraversal(root.right, arr);
    }
};

后序遍历

var postorderTraversal = function(root) {
    if (root) {
        postorderTraversal(root.left, arr);
        postorderTraversal(root.right, arr);
        arr.push(root.val);
    }
}
var postorderTraversal = function(root) {
    let node = root;
    let stack = [];
    let ans = [];
    while (node !== null || stack.length > 0) {
        if (node) {
            ans.unshift(node.val); // 先序遍历相反的操作
            stack.push(node);
            node = node.right; // 先序遍历相反的操作
            continue;
        }
        node = stack.pop();
        node = node.left; // 先序遍历相反的操作
    }
    return ans;
};

层次遍历

   3
   / \
  9  20
    /  \
   15   7
输出 [[3],[9,20],[15,7]]

核心思想:用一个队列记录当前层的节点。用另一个队列记录下一层的节点。对当前层的节点做出队列的操作,保证左孩子在右孩子之前。如果当前节点有左孩子或者右孩子就加入下一层的队列当中。当当前队列已经为空就用下一层的节点来替换,并清空下一层节点的队列以及结果。

var levelOrder = function(root) {
    let ans = [];
    if (root) {
        let queue = [root];
        let nextLevel = [];
        let levelNodes = [];
        while (queue.length > 0) {
            let node = queue.shift();
            if (node) {
                levelNodes.push(node.val);
                node.left && nextLevel.push(node.left);
                node.right && nextLevel.push(node.right);
            }
            if (queue.length === 0) { //当前队列为空,将被赋值下一层的节点,并清空当前层的节点
                ans.push(levelNodes);
                queue = nextLevel;
                nextLevel = [];
                levelNodes = [];
            }
        }
    }
    return ans;
}