[LeetCode 树的遍历 && 最长连续递增序列 ] | 刷题打卡

196 阅读2分钟

144. 二叉树的前序遍历

leetcode-cn.com/problems/bi…

  • 递归
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
    if(root === null){
        return []
    }
    const left = preorderTraversal(root.left)
    const right = preorderTraversal(root.right)
    return [root.val,...left,...right]
};
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
    const stack = [root]
    const res = []
    while(stack.length){
        const node  = stack.pop()
        if(!node) continue
        res.push(node.val)
        
        stack.push(node.right)
        stack.push(node.left)
    }
    return res
};
  • 三色标记法
    • 用白色表示尚未访问
    • 灰色表示尚未完全访问子节点
    • 黑色表示子节点全部访问
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var preorderTraversal = function(root) {
    const White = 0
    const Gray = 1
    const stack = [{
        color:White,
        node:root
    }]
    const res = []

    while(stack.length){
        const {color,node} = stack.pop()
        if(!node) continue
        if(color === White){
            stack.push({
                color:White,
                node:node.right
            })
            stack.push({
                color:White,
                node:node.left
            })
            stack.push({
                color:Gray,
                node:node
            })
            
        }else{
            res.push(node.val)
        }
    }

    return res 
};

94. 二叉树的中序遍历

leetcode-cn.com/problems/bi…

  • 递归
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function(root) {
    if(root === null){
        return []
    }
    const left = inorderTraversal(root.left)
    const right = inorderTraversal(root.right)
    return [...left,root.val,...right]

};
  • 栈 一直从跟节点往左子树遍历直到走到尽头 在往父节点回溯
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function (root) {
    const stack = []
    let curr = root
    const res = []

    while(stack.length || curr){
        while(curr){
            stack.push(curr)
            curr = curr.left
        }
        curr = stack.pop()
        res.push(curr.val)
        curr = curr.right
    }
    return res
};
  • 三色标记法
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var inorderTraversal = function (root) {
    const White = 0
    const Gray = 1
    const stack = [{
        color: White,
        node: root
    }]
    const res = []
    while (stack.length) {
        const { color, node } = stack.pop()
        if (!node) continue
        if (node && color === White) {
            stack.push({
                color: White,
                node: node.right
            })
            stack.push({
                color: Gray,
                node: node
            })
            stack.push({
                color: White,
                node: node.left
            })
        } else {
            res.push(node.val)
        }
    }
    return res

};

145. 二叉树的后序遍历

leetcode-cn.com/problems/bi…

  • 递归
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var postorderTraversal = function(root) {
    if(!root){
        return []
    }
    const left = postorderTraversal(root.left)
    const right = postorderTraversal(root.right)
    return [...left,...right,root.val]
};
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var postorderTraversal = function(root) {
    const stack = [root]
    const res = []

    while(stack.length){
        const node = stack.pop()
        if(!node) continue
        res.unshift(node.val)
        stack.push(node.left)
        stack.push(node.right)


    }
    return res
};
  • 三色标记法
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var postorderTraversal = function(root) {
    const White = 0
    const Gray = 1
    const stack = [{
        color:White,
        node:root
    }]
    const res = []

    while(stack.length){
        const {color,node} = stack.pop()
        if(!node) continue
        if(color === White){
            stack.push({
                color:Gray,
                node:node
            })
            
            stack.push({
                color:White,
                node:node.right
            })

            stack.push({
                color:White,
                node:node.left
            })
            
        }else{
            res.push(node.val)
        }
    }

    return res 
};

674. 最长连续递增序列

leetcode-cn.com/problems/lo…

/**
 * @param {number[]} nums
 * @return {number}
 */
var findLengthOfLCIS = function (nums) {
    if (!nums.length) return 0

    let maxCounter = 1
    let counter = 1
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] > nums[i - 1]) {
            counter++
        } else {
            counter = 1
        }
        maxCounter = Math.max(maxCounter, counter)
    }

    return maxCounter

};