zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    Algorithm Gossip (48) 上三角、下三角、对称矩阵
    .Algorithm Gossip (47) 多维矩阵转一维矩阵
    Algorithm Gossip (46) 稀疏矩阵存储
    Algorithm Gossip (45) 费氏搜寻法
    Algorithm Gossip (44) 插补搜寻法
    Algorithm Gossip (43) 二分搜寻法
    Algorithm Gossip (42) 循序搜寻法(使用卫兵)
    Algorithm Gossip (41) 基数排序法
    Algorithm Gossip (40) 合并排序法
    AlgorithmGossip (39) 快速排序法 ( 三 )
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10519664.html
Copyright © 2011-2022 走看看