miracles1919 / js-algorithm

js algorithm
1 stars 0 forks source link

【数据结构】二叉树 #9

Open miracles1919 opened 2 years ago

miracles1919 commented 2 years ago

两种解法:

参考:

miracles1919 commented 2 years ago

前序、中序、后序

function traverse(root){
  if (root === null) return 

  // 前序位置
  traverse(root.left)
  // 中序位置
  traverse(root.right)
  // 后序位置
}
miracles1919 commented 2 years ago

226. 翻转二叉树

var invertTree = function(root) {
    traverse(root)
    return root
};

function traverse(root) {
    if (root === null) return

    let temp = root.right
    root.right = root.left
    root.left = temp

    traverse(root.left)
    traverse(root.right)
}
// 定义:返回翻转后的二叉树的根节点
var invertTree = function(root) {
    if(root === null) return null

    const left = invertTree(root.left)
    const right = invertTree(root.right)
    root.left = right
    root.right = left
    return root 
};
miracles1919 commented 2 years ago

116. 填充每个节点的下一个右侧节点指针

var connect = function(root) {
    if (root === null) return null
    traverse(root.left, root.right)
    return root
};

function traverse(node1, node2) {
    if (node1 === null || node2 === null) {
        return null
    }

    node1.next = node2
    traverse(node1.left, node1.right)
    traverse(node2.left, node2.right)
    // 跨父节点的子节点
    traverse(node1.right, node2.left)
}

层序遍历

var connect = function(root) {
    if (root === null) return root

    const queue = [root]

    while (queue.length) {
        const size = queue.length

        for (let i = 0; i < size; i++) {
            const node = queue.shift()

            if (i < size - 1) {
                node.next = queue[0]
            }

            if (node.left) {
                queue.push(node.left)
            }

            if (node.right) {
                queue.push(node.right)
            }
        }
    }

    return root
};
miracles1919 commented 2 years ago

114. 二叉树展开为链表

var flatten = function(root) {
    const r = root

    while (root) {
        let node = root.left
        if (node) {
            while(node.right) node = node.right
            // 处理左子树
            node.right = root.right
            root.right = root.left
            root.left = null
        }
        root = root.right
    }

    return r
};