比如有下面的一棵树
E[1]
E[1]{1}
E[1]{1-1}
E[1]{1-2}
E[1]{1-1}-2
编码成10位数
编码以后是
0100000000
0101000000
0101010000
0101020000
0101012000
怎么设计一个算法实现上面的功能呢?请教各位老师们?

解决方案 »

  1.   

    void CTreeStructDlg::OnBtnSave()    //保存地层层序编码
    { // TODO: Add your control notification handler code here    std::vector<HTREEITEM> vecRootItem; //一级结点根目录
    CString strVal=_T("");
    CString strFormat = _T("");
    CString strSQL = _T("");
    std::vector<CString> vecString; //一级结点根内容
    HTREEITEM hItem;
    int nIndex = 1;
    long lStdStratID = 0; //当前分层版本号 int index=0;
    long lStratId;
    CString cstr;
           index = m_comb1.GetCount();
    index=m_comb1.GetCurSel();
    m_comb1.GetLBText(index,cstr);
      lStdStratID=atol(cstr);    //lNO=111

            m_AdoConn.OnInitADOConn();

    //一级结点
    hItem = m_wndTree.GetRootItem();
    strVal = m_wndTree.GetItemText(hItem);
    vecString.push_back(strVal);
    while (hItem!=NULL)
    {
    vecRootItem.push_back(hItem);
    hItem = m_wndTree.GetNextSiblingItem(hItem);
    strVal = m_wndTree.GetItemText(hItem);
    vecString.push_back(strVal);
    }
    ////////
    for(std::vector<CString>::iterator iter = vecString.begin(); iter != vecString.end()-1; iter ++)
    {
    strFormat.Format("%d",nIndex);  //nIndex=1
    if (1 == lstrlen(strFormat))   
    {
    strVal.Format("0%d00000000",nIndex);
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"   //ID!!!=0
    ,strVal
    ,lStdStratID
    ,*iter);

    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    }
    else
    {
    strVal.Format("%d00000000",nIndex);
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,strVal
    ,lStdStratID
    ,*iter);

    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    }
    nIndex ++;
    }
    // m_AdoConn.ExitConnect();                 //add
    vecString.clear(); //二级结点
    for (std::vector<HTREEITEM>::iterator iter2 = vecRootItem.begin(); iter2 != vecRootItem.end(); iter2 ++)
    {
    HTREEITEM hItem2;
    std::vector<HTREEITEM> vecRoot2; //二级结点根目录
    std::vector<CString> vecString2; //二级结点根内容
    long nIndex2 = 1; hItem2 = m_wndTree.GetChildItem(*iter2);
    strVal = m_wndTree.GetItemText(hItem2);
    vecString2.push_back(strVal);                //strVal=E[1]{1-1}
    while (NULL != hItem2)
    {
    vecRoot2.push_back(hItem2);
    hItem2 = m_wndTree.GetNextSiblingItem(hItem2);
    strVal = m_wndTree.GetItemText(hItem2);
    vecString2.push_back(strVal);
    } for (std::vector<CString>::iterator iter3 = vecString2.begin(); iter3 != vecString2.end()-1; iter3 ++)
    {
    strVal = m_wndTree.GetItemText(*iter2);
    strFormat.Format("SELECT STRATLEVEL FROM SYS_STDSTRATDESC WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,lStdStratID
    ,strVal);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    while(!m_AdoConn.m_pRecordset->adoEOF)
    {
    m_AdoConn.m_pRecordset->GetCollect("STRATLEVEL");
    m_AdoConn.m_pRecordset->MoveNext();
    }
    std::string str = "";
    str = (LPCTSTR)(strVal);
    str = str.substr(0,2);    //!!! str='E['返回一个从指定位置(0)开始,并具有指定长度(2)的子字符串 
    strFormat.Format("%d",nIndex2);
    if (1 == lstrlen(strFormat))
    {
    strVal.Format("%s0%d000000",str.c_str(),nIndex2);  //int i = atoi(str.c_str());
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,strVal
    ,lStdStratID
    ,*iter3);

    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    }
    else
    {
    strVal.Format("%s%d000000",nIndex2);
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,strVal
    ,lStdStratID
    ,*iter3);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat); m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    }
    nIndex2 ++;
    }
    // m_AdoConn.ExitConnect();  //add
    vecString2.clear(); //三级结点
    for (std::vector<HTREEITEM>::iterator iter4 = vecRoot2.begin(); iter4 != vecRoot2.end(); iter4 ++)
    {
    HTREEITEM hItem3;
    std::vector<HTREEITEM> vecRoot3; //三级结点根目录
    std::vector<CString> vecString3; //三级结点跟内容
    long lIndex3 = 1; hItem3 = m_wndTree.GetChildItem(*iter4);
    strVal = m_wndTree.GetItemText(hItem3);
    vecString3.push_back(strVal); while (hItem3!=NULL)
    {
    vecRoot3.push_back(hItem3);
    hItem3 = m_wndTree.GetNextSiblingItem(hItem3);
    strVal = m_wndTree.GetItemText(hItem3);
    vecString3.push_back(strVal);
    } for (std::vector<CString>::iterator iter5 = vecString3.begin(); iter5 != vecString3.end()-1; iter5 ++)
    {
    strVal = m_wndTree.GetItemText(*iter4);
    strFormat.Format("SELECT STRATLEVEL FROM SYS_STDSTRATDESC WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,lStdStratID
    ,strVal);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    while(!m_AdoConn.m_pRecordset->adoEOF)
    {
    m_AdoConn.m_pRecordset->GetCollect("STRATLEVEL");
    m_AdoConn.m_pRecordset->MoveNext();
    }
    std::string str1 = "";
    str1 = (LPCTSTR)(strVal);
    str1 = str1.substr(0,4); strFormat.Format("%d",lIndex3);
    if (1 == lstrlen(strFormat))
    {
    strVal.Format("%s0%d0000",lIndex3);
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,strVal
    ,lStdStratID
    ,*iter5);
    // rst.Open(strFormat);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    }
    else
    {
    strVal.Format("%s%d0000",str1.c_str(),lIndex3);
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,strVal
    ,lStdStratID
    ,*iter5);
    // rst.Open(strFormat);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    }
    lIndex3 ++;
    }
    // m_AdoConn.ExitConnect();  //add
    vecString3.clear();
      

  2.   

    //四级结点
    for (std::vector<HTREEITEM>::iterator iter6 = vecRoot3.begin(); iter6 != vecRoot3.end(); iter6 ++)
    {
    HTREEITEM hItem4;
    std::vector<HTREEITEM> vecRoot4; //三级结点根目录
    std::vector<CString> vecString4; //三级结点跟内容
    long lIndex4 = 1; hItem4 = m_wndTree.GetChildItem(*iter6);
    strVal = m_wndTree.GetItemText(hItem4);
    vecString4.push_back(strVal); while (NULL != hItem4)
    {
    vecRoot4.push_back(hItem4);
    hItem4 = m_wndTree.GetNextSiblingItem(hItem4);
    strVal = m_wndTree.GetItemText(hItem4);
    vecString4.push_back(strVal);
    } for (std::vector<CString>::iterator iter7 = vecString4.begin(); iter7 != vecString4.end()-1; iter7 ++)
    {
    strVal = m_wndTree.GetItemText(*iter6);
    strFormat.Format("SELECT STRATLEVEL FROM SYS_STDSTRATDESC WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,lStdStratID
    ,strVal);
    // rst.Open(strFormat);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    while(!m_AdoConn.m_pRecordset->adoEOF)
    {
    m_AdoConn.m_pRecordset->GetCollect("STRATLEVEL");
    m_AdoConn.m_pRecordset->MoveNext();
    } std::string str2 = "";
    str2 = (LPCTSTR)(strVal);
    str2 = str2.substr(0,6); strFormat.Format("%d",lIndex4);
    if (1 == lstrlen(strFormat))
    {
    strVal.Format("%s0%d00",str2.c_str(),lIndex4);
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,strVal
    ,lStdStratID
    ,*iter7);
    // rst.Open(strFormat);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    }
    else
    {
    strVal.Format("%s%d00",str2.c_str(),lIndex4);
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,strVal
    ,lStdStratID
    ,*iter7);
    // rst.Open(strFormat);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    }
    lIndex4 ++;
    }
    // m_AdoConn.ExitConnect(); 
    vecString4.clear(); //五级结点
    for (std::vector<HTREEITEM>::iterator iter8 = vecRoot4.begin(); iter8 != vecRoot4.end(); iter8 ++)
    {
    HTREEITEM hItem5;
    std::vector<HTREEITEM> vecRoot5; //三级结点根目录
    std::vector<CString> vecString5; //三级结点跟内容
    long lIndex5 = 1; hItem5 = m_wndTree.GetChildItem(*iter8);
    strVal = m_wndTree.GetItemText(hItem5);
    vecString5.push_back(strVal); while (NULL != hItem5)
    {
    vecRoot5.push_back(hItem5);
    hItem5 = m_wndTree.GetNextSiblingItem(hItem5);
    strVal = m_wndTree.GetItemText(hItem5);
    vecString5.push_back(strVal);
    } for (std::vector<CString>::iterator iter9 = vecString5.begin(); iter9 != vecString5.end()-1; iter9 ++)
    {
    strVal = m_wndTree.GetItemText(*iter8);
    strFormat.Format("SELECT STRATLEVEL FROM SYS_STDSTRATDESC WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,lStdStratID
    ,strVal);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    while(!m_AdoConn.m_pRecordset->adoEOF)
    {
    m_AdoConn.m_pRecordset->GetCollect("STRATLEVEL");
    m_AdoConn.m_pRecordset->MoveNext();
    } std::string str3 = "";
    str3 = (LPCTSTR)(strVal);
    str3 = str3.substr(0,8); strFormat.Format("%d",lIndex5);
    if (1 == lstrlen(strFormat))
    {
    strVal.Format("%s0%d",str3.c_str(),lIndex5);
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,strVal
    ,lStdStratID
    ,*iter9);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat);
    }
    else
    {
    strVal.Format("%s%d",str3.c_str(),lIndex5);
    strFormat.Format("UPDATE SYS_STDSTRATDESC SET STRATLEVEL = '%s' WHERE STDSTRATID = %d AND STRATCODE = '%s'"
    ,strVal
    ,lStdStratID
    ,*iter9);
    // rst.Open(strFormat);
    m_AdoConn.m_pRecordset=m_AdoConn.GetRecordSet((_bstr_t)strFormat); }
    lIndex5 ++;
    }
    vecString5.clear();
    }
    }
    }
    }
    AfxMessageBox("标准地层级别编码已保存!");//更新数据库已完成!
    UpdateData(FALSE);
    }