Back to all solutions

#2689 - Extract Kth Character From The Rope Tree

Problem Description

You are given the root of a binary tree and an integer k. Besides the left and right children, every node of this tree has two other properties, a string node.val containing only lowercase English letters (possibly empty) and a non-negative integer node.len. There are two types of nodes in this tree:

  • Leaf: These nodes have no children, node.len = 0, and node.val is some non-empty string.
  • Internal: These nodes have at least one child (also at most two children), node.len > 0, and node.val is an empty string.

The tree described above is called a Rope binary tree. Now we define S[node] recursively as follows:

  • If node is some leaf node, S[node] = node.val,
  • Otherwise if node is some internal node, S[node] = concat(S[node.left], S[node.right]) and S[node].length = node.len.

Return k-th character of the string S[root].

Note: If s and p are two strings, concat(s, p) is a string obtained by concatenating p to s.

For example, concat("ab", "zz") = "abzz".

Solution

/**
 * Definition for a rope tree node.
 * class RopeTreeNode {
 *     constructor(len, val, left, right) {
 *         this.len = (len===undefined ? 0 : len);
 *         this.val = (val===undefined ? "" : val);
 *         this.left = (left===undefined ? null : left);
 *         this.right = (right===undefined ? null : right);
 *     }
 * }
 */
/**
 * @param {RopeTreeNode} root
 * @param {number} k
 * @return {character}
 */
var getKthCharacter = function(root, k) {
  if (!root.left && !root.right) {
    return root.val[k - 1];
  }

  const leftLength = getSubtreeLength(root.left);

  if (k <= leftLength) {
    return getKthCharacter(root.left, k);
  } else {
    return getKthCharacter(root.right, k - leftLength);
  }

  function getSubtreeLength(node) {
    if (!node) return 0;
    if (!node.left && !node.right) {
      return node.val.length;
    }
    return node.len;
  }
};