ys memos

Blog

[C++]LeetCode230 Kth Smallest Element in a BSTを解く


cpp

2022/04/19

Rust 版


binary search tree の,先頭からk番目の数値を答える問題

Rust で解いてみたので,慣れている C++で解いてみた.


main.cpp
class Solution {
  tuple<TreeNode*, int> helper(TreeNode* root, int k) {
    if (!root) return { nullptr, k };
    TreeNode* node;
    int next;
    tie(node, next) = helper(root->left, k);
    if (!node) {
      if (next == 1) return { root, 0 };
      else return helper(root->right, next - 1);
    } else {
      return { node, 0 };
    }
  }
public:
  int kthSmallest(TreeNode* root, int k) {
    return get<0>(helper(root, k))->val;
  }
};


class Solution {
  tuple<TreeNode*, int> helper(TreeNode* root, int k) {

    if (!root) return { nullptr, k };

探索対象の左にノードが存在する場合は,「それより小さい値」が存在するため,先にカウントする.

そして,k番目のノードが発見されたかをnodeに,残りカウントをnextに格納する.

    TreeNode* node;
    int next;
    tie(node, next) = helper(root->left, k);

左にk番目が合った場合はそれを返す.

無くて,自身がk番目であれば自身を返す.

どちらでもない場合はカウントを引き継ぎつつ右方向に再帰する.

    if (!node) {
      if (next == 1) return { root, 0 };
      else return helper(root->right, next - 1);
    } else {
      return { node, 0 };
    }
  }

探索結果の値(val)を返す.

public:
  int kthSmallest(TreeNode* root, int k) {
    return get<0>(helper(root, k))->val;
  }
};

ポインタの扱いが簡潔で良い点が心地よい.これによりメモリの危険性があることは,悩みどころだと感じる.

また,nullptrによるアーリーリターンが,複雑になりがちな再帰処理の中で,頭をすっきりさせることに多く寄与している印象がある.具体的に,「入力がからの場合はこの関数はすぐおしまい!」とすることで,頭の中で扱うことで,考慮すべき項目を一つ減らすことが出来ていた.

これに関しては,Rust のmatchに慣れると改善されるのだろうと思う.


関連タグを探す