diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp
index 20cda91a31fc8c62618def496d0c5820330419fd..7ac635a003c7bfd1933e3af8474273e01467d6ab 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_node_reader.cpp
@@ -27,7 +27,9 @@ void DynamicPatriciaTrieNodeReader::fetchNodeInfoFromBufferAndProcessMovedNode(c
     const uint8_t *const dictRoot = mBinaryDictionaryInfo->getDictRoot();
     int pos = nodePos;
     mFlags = PatriciaTrieReadingUtils::getFlagsAndAdvancePosition(dictRoot, &pos);
-    mParentPos = DynamicPatriciaTrieReadingUtils::getParentPosAndAdvancePosition(dictRoot, &pos);
+    const int parentPos =
+            DynamicPatriciaTrieReadingUtils::getParentPosAndAdvancePosition(dictRoot, &pos);
+    mParentPos = (parentPos != 0) ? mNodePos + parentPos : NOT_A_DICT_POS;
     if (outCodePoints != 0) {
         mCodePointCount = PatriciaTrieReadingUtils::getCharsAndAdvancePosition(
                 dictRoot, mFlags, maxCodePointCount, outCodePoints, &pos);
diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp
index 0b73efae3fae9193b0c3d248acdd9978e4b28e20..3df505688300c97a7749c9e3d079a1bbdb770af8 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_policy.cpp
@@ -94,7 +94,7 @@ int DynamicPatriciaTriePolicy::getCodePointsAndProbabilityAndReturnCodePointCoun
         reverseCodePoints[codePointCount++] = mergedNodeCodePoints[i];
     }
     // Then, follow parent pos toward the root node.
-    while (nodeReader.getParentPos() != getRootPosition()) {
+    while (nodeReader.getParentPos() != NOT_A_DICT_POS) {
         // codePointCount must be incremented at least once in each iteration to ensure preventing
         // infinite loop.
         if (nodeReader.isDeleted() || codePointCount > maxCodePointCount
diff --git a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h
index f44c2651a20e149a7f3e129643b8d2752a1d927e..5398d7e375a0da7d52db077d52a11c1495f5421d 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h
+++ b/native/jni/src/suggest/policyimpl/dictionary/dynamic_patricia_trie_reading_utils.h
@@ -39,8 +39,7 @@ class DynamicPatriciaTrieReadingUtils {
 
     static AK_FORCE_INLINE int getParentPosAndAdvancePosition(const uint8_t *const buffer,
             int *const pos) {
-        const int base = *pos;
-        return base + ByteArrayUtils::readSint24AndAdvancePosition(buffer, pos);
+        return ByteArrayUtils::readSint24AndAdvancePosition(buffer, pos);
     }
 
     static int readChildrenPositionAndAdvancePosition(const uint8_t *const buffer,