• [Algorithm] Tree: Lowest Common Ancestor


    By given a tree structure, task is to find lowest common ancestor:

    For example, LCA(4, 5) --> >3

    LCA(4,2) --> 1

    LCA(3, 5) --> 3

    LCA(6, 6) --> 6

    Solution to solve the problem:

    Found two path to the given two node, then compare two list to see from which point, they are no long equals:

    [4,3,1]
    [5,6,3,1]
     
    // the lowest common ancestor would be 3
    

      

    Code:

    function createNode(val, left = null, right = null) {
      return {
        val,
        left,
        addLeft(leftKey) {
          return (this.left = leftKey ? createNode(leftKey) : null);
        },
        right,
        addRight(rightKey) {
          return (this.right = rightKey ? createNode(rightKey) : null);
        }
      };
    }
    function createBT(rootKey) {
      const root = createNode(rootKey);
      return {
        root,
        // Lowest Common Ancestor
        lca(root, j, k) {
          function helper(node, val) {
            let leftPath;
            let rightPath;
            if (!node) {
              return null;
            }
    
            // One we found the value,
            // constucte an array, then the path will be added to this array
            // thinking JS call stack, from bottom up
            // The way recusive works is found the base case, then do the bottom up
            if (node.val === val) {
              return [val];
            }
    
            if (node.left) {
              // If foudd will return an array
              // If not then will return null
              leftPath = helper(node.left, val);
              if (leftPath !== null) {
                leftPath.push(node.val);
                return leftPath;
              }
            }
    
            if (node.right) {
              // If foudd will return an array
              // If not then will return null
              rightPath = helper(node.right, val);
              if (rightPath !== null) {
                rightPath.push(node.val);
                return rightPath;
              }
            }
    
            return null;
          }
    
          const jPath = helper(root, j);
          const kPath = helper(root, k);
          let found = null;
    
          while (jPath.length > 0 && kPath.length > 0) {
            let fromJ = jPath.pop();
            let fromK = kPath.pop();
            if (fromJ === fromK) {
              found = fromJ;
            } else {
              break;
            }
          }
    
          return found;
        }
      };
    }
    
    const tree = createBT("1");
    const root = tree.root;
    const left = root.addLeft("3");
    root.addRight("2");
    const leftleft = left.addLeft("4");
    const leftright = left.addRight("6");
    const leftRighttleft = leftright.addLeft("5");
    
    console.log(tree.lca(root, "6", "6")); // 6
    console.log(tree.lca(root, "4", "5")); // 3
    console.log(tree.lca(root, "4", "2")); // 1
    console.log(tree.lca(root, "3", "4")); // 3
  • 相关阅读:
    centos网卡一致性命名规则
    CloudBoot裸机部署服务器
    vmware-nic teaming
    电商 Excel 列 连接,类似SQL里面的 join
    Layui 多选
    电商工具 谷歌插件 版本 2021-06-11
    电商工具 谷歌插件 数据抓取 数据下载 生意参谋的访客数据、淘宝后台订单、主图、详情图、评论、物流、直通车数据
    其它 VS Code 配置选中的文字
    C# 跨域
    PS 字体的使用
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10519664.html
Copyright © 2020-2023  润新知