public void OnAfterDeserialize()
        {
            if (m_serials == null || m_serials.Count == 0)
            {
                return;
            }

            List <KDTreeNode> nodes = new List <KDTreeNode>();

            for (int i = 0; i < m_serials.Count; ++i)
            { //populate all KDTreeNode first
                KDTreeSerial s    = m_serials[i];
                KDTreeNode   node = new KDTreeNode();
                node.pos = s.pos;
                nodes.Add(node);
            }
            for (int i = 0; i < nodes.Count; ++i)
            { //recover the links
                int l = m_serials[i].leftIdx;
                nodes[i].left = l >= 0 ? nodes[l] : null;
                int r = m_serials[i].rightIdx;
                nodes[i].right = r >= 0 ? nodes[r] : null;
                int p = m_serials[i].parentIdx;
                nodes[i].parent = p >= 0 ? nodes[p] : null;
            }

            m_rootNode = nodes[nodes.Count - 1]; //post-order serialization
        }
        private int _Recur_Serialize(KDTreeNode nd)
        {
            KDTreeSerial s = new KDTreeSerial();

            if (nd.left != null)
            {
                s.leftIdx = _Recur_Serialize(nd.left);
            }
            if (nd.right != null)
            {
                s.rightIdx = _Recur_Serialize(nd.right);
            }

            s.pos = nd.pos;
            m_serials.Add(s);
            int curId = m_serials.Count - 1;

            if (s.leftIdx >= 0)
            {
                m_serials[s.leftIdx].parentIdx = curId;
            }
            if (s.rightIdx >= 0)
            {
                m_serials[s.rightIdx].parentIdx = curId;
            }

            return(curId);
        }