Welcome to Subscribe On Youtube

2689. Extract Kth Character From The Rope Tree

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]).

 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".

 

Example 1:

Input: root = [10,4,"abcpoe","g","rta"], k = 6
Output: "b"
Explanation: In the picture below, we put an integer on internal nodes that represents node.len, and a string on leaf nodes that represents node.val.
You can see that S[root] = concat(concat("g", "rta"), "abcpoe") = "grtaabcpoe". So S[root][5], which represents 6th character of it, is equal to "b".

Example 2:

Input: root = [12,6,6,"abc","efg","hij","klm"], k = 3
Output: "c"
Explanation: In the picture below, we put an integer on internal nodes that represents node.len, and a string on leaf nodes that represents node.val.
You can see that S[root] = concat(concat("abc", "efg"), concat("hij", "klm")) = "abcefghijklm". So S[root][2], which represents the 3rd character of it, is equal to "c".

Example 3:

Input: root = ["ropetree"], k = 8
Output: "e"
Explanation: In the picture below, we put an integer on internal nodes that represents node.len, and a string on leaf nodes that represents node.val.
You can see that S[root] = "ropetree". So S[root][7], which represents 8th character of it, is equal to "e".

 

Constraints:

  • The number of nodes in the tree is in the range [1, 103]
  • node.val contains only lowercase English letters
  • 0 <= node.val.length <= 50
  • 0 <= node.len <= 104
  • for leaf nodes, node.len = 0 and node.val is non-empty
  • for internal nodes, node.len > 0 and node.val is empty
  • 1 <= k <= S[root].length

Solutions

  • /**
     * Definition for a rope tree node.
     * class RopeTreeNode {
     *     int len;
     *     String val;
     *     RopeTreeNode left;
     *     RopeTreeNode right;
     *     RopeTreeNode() {}
     *     RopeTreeNode(String val) {
     *         this.len = 0;
     *         this.val = val;
     *     }
     *     RopeTreeNode(int len) {
     *         this.len = len;
     *         this.val = "";
     *     }
     *     RopeTreeNode(int len, TreeNode left, TreeNode right) {
     *         this.len = len;
     *         this.val = "";
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public char getKthCharacter(RopeTreeNode root, int k) {
            return dfs(root).charAt(k - 1);
        }
    
        private String dfs(RopeTreeNode root) {
            if (root == null) {
                return "";
            }
            if (root.val.length() > 0) {
                return root.val;
            }
            String left = dfs(root.left);
            String right = dfs(root.right);
            return left + right;
        }
    }
    
  • /**
     * Definition for a rope tree node.
     * struct RopeTreeNode {
     *     int len;
     *     string val;
     *     RopeTreeNode *left;
     *     RopeTreeNode *right;
     *     RopeTreeNode() : len(0), val(""), left(nullptr), right(nullptr) {}
     *     RopeTreeNode(string s) : len(0), val(std::move(s)), left(nullptr), right(nullptr) {}
     *     RopeTreeNode(int x) : len(x), val(""), left(nullptr), right(nullptr) {}
     *     RopeTreeNode(int x, RopeTreeNode *left, RopeTreeNode *right) : len(x), val(""), left(left), right(right) {}
     * };
     */
    class Solution {
    public:
        char getKthCharacter(RopeTreeNode* root, int k) {
            function<string(RopeTreeNode* root)> dfs = [&](RopeTreeNode* root) -> string {
                if (root == nullptr) {
                    return "";
                }
                if (root->len == 0) {
                    return root->val;
                }
                string left = dfs(root->left);
                string right = dfs(root->right);
                return left + right;
            }; 
            return dfs(root)[k - 1];
        }
    };
    
  • # Definition for a rope tree node.
    # class RopeTreeNode(object):
    #     def __init__(self, len=0, val="", left=None, right=None):
    #         self.len = len
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def getKthCharacter(self, root: Optional[object], k: int) -> str:
            def dfs(root):
                if root is None:
                    return ""
                if root.len == 0:
                    return root.val
                return dfs(root.left) + dfs(root.right)
    
            return dfs(root)[k - 1]
    
    
  • /**
     * Definition for a rope tree node.
     * type RopeTreeNode struct {
     * 	   len   int
     * 	   val   string
     * 	   left  *RopeTreeNode
     * 	   right *RopeTreeNode
     * }
     */
    func getKthCharacter(root *RopeTreeNode, k int) byte {
    	var dfs func(root *RopeTreeNode) string
    	dfs = func(root *RopeTreeNode) string {
    		if root == nil {
    			return ""
    		}
    		if root.len == 0 {
    			return root.val
    		}
    		left, right := dfs(root.left), dfs(root.right)
    		return left + right
    	}
    	return dfs(root)[k-1]
    }
    

All Problems

All Solutions