Skip to content

叉树

  • 二叉树的遍历
    • 前序遍历
    • 中序遍历
    • 后序遍历
    • 层序遍历
  • 二叉树的属性
    • 对称二叉树
    • 二叉树最大深度
    • 二叉树最小深度
    • 完全二叉树的节点个数
    • 平衡二叉树
    • 二叉树的所有路径
    • 左叶子之和
    • 找树右下角的值
    • 路径总和
  • 二叉树的修改与构造
    • 反转二叉树
    • 最大二叉树
    • 合并二叉树
    • 从中序和前序遍历构造二叉树
    • 从中序和后序遍历构造二叉树
  • 二叉树公共祖先问题
    • 二叉搜索树的最近公共祖先
    • 二叉树的最近公共祖先
  • 二叉搜索树的属性
    • 二叉搜索树的搜索
    • 二叉搜索树的验证
    • 二叉搜索树的最小绝对差
    • 二叉搜索树的众数
    • 二叉搜索树转换成累加树
  • 二叉搜索树的修改与构造
    • 二叉树搜索树的插入
    • 二叉树搜索树的删除
    • 二叉树搜索树的修剪
    • 有序数组生成二叉树搜索树

翻转二叉树

leetcode: 给定一棵二叉树的根节点 root,请左右翻转这棵二叉树,并返回其根节点。

js
var mirrorTree = function (root) {
    function loop(root) {
        if (root === null) return;
        [root["left"], root["right"]] = [root["right"], root["left"]];
        mirrorTree(root.left);
        mirrorTree(root.right);
    }
    loop(root);
    return root;
};
var mirrorTree = function (root) {
    function loop(root) {
        if (root === null) return;
        [root["left"], root["right"]] = [root["right"], root["left"]];
        mirrorTree(root.left);
        mirrorTree(root.right);
    }
    loop(root);
    return root;
};

从前序与中序遍历序列构造二叉树

leetcode: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

js
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */

/**
 * @param {number[]} preorder
 * @param {number[]} inorder
 * @return {TreeNode}
 */

// 根左右 [3,9,20,15,7]
// 左根右 [9,3,15,20,7]
var buildTree1 = function (preorder, inorder) {
    if (inorder.length == 0) return null;
    // 先序第一个就是 root
    const root = new TreeNode(preorder[0]);
    // root 在中序数组中的索引位置,
    // 计算可知 root左树的节点个数 === mid
    // 计算可知 root右树的节点个数 === inorder.length - mid - 1
    const mid = inorder.indexOf(preorder[0]);
    const l1 = preorder.slice(1, mid + 1); // 获取 root 左子树的 preorder 序列。
    const l2 = inorder.slice(0, mid); // 获取 root 左子树的 inorder 序列。
    root.left = buildTree(l1, l2);
    // 同理
    const r1 = preorder.slice(mid + 1); // 获取 root 右子树的 preorder 序列。
    const r2 = inorder.slice(mid + 1); // 获取 root 右子树的 inorder 序列。
    root.right = buildTree(r1, r2);
    return root;
};
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */

/**
 * @param {number[]} preorder
 * @param {number[]} inorder
 * @return {TreeNode}
 */

// 根左右 [3,9,20,15,7]
// 左根右 [9,3,15,20,7]
var buildTree1 = function (preorder, inorder) {
    if (inorder.length == 0) return null;
    // 先序第一个就是 root
    const root = new TreeNode(preorder[0]);
    // root 在中序数组中的索引位置,
    // 计算可知 root左树的节点个数 === mid
    // 计算可知 root右树的节点个数 === inorder.length - mid - 1
    const mid = inorder.indexOf(preorder[0]);
    const l1 = preorder.slice(1, mid + 1); // 获取 root 左子树的 preorder 序列。
    const l2 = inorder.slice(0, mid); // 获取 root 左子树的 inorder 序列。
    root.left = buildTree(l1, l2);
    // 同理
    const r1 = preorder.slice(mid + 1); // 获取 root 右子树的 preorder 序列。
    const r2 = inorder.slice(mid + 1); // 获取 root 右子树的 inorder 序列。
    root.right = buildTree(r1, r2);
    return root;
};

༼ つ/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿◕ _◕ ༽つ/̵͇̿̿/’̿’̿ ̿ ̿̿ ̿̿ ̿̿