C++ 非递归遍历树结构

struct ST_NODE
{
	wstring wstrParentNode;
	wstring wstrChildNode;
	wstring wstrNodeName;
};

struct ST_MENU
{
	wstring wstrNodeId;
	wstring wstrNodeName;
};

vector<vector<wstring>> vctData;
stack<wstring> majorStack;	// 主栈
stack<ST_NODE> minorStack;	// 副栈
wstring wstrMajorNode = L"";
bool bIsRtn = false;
vector<ST_MENU> vctNode;

for (size_t i = 0; i < vctData.size(); ++i)

{
    ST_NODE stNode;
    stNode.wstrChildNode = vctData[i][0];
	stNode.wstrParentNode = vctData[i][1];
	stNode.wstrNodeName = vctData[i][2];
    minorStack.push(stNode);

    vctNode.clear();

    while (!minorStack.empty())
    {
		stNode = minorStack.top();
		minorStack.pop();  // 出副栈
		majorStack.push(stNode.wstrChildNode);  // 入主栈

        ST_MENU stMenu;
		stMenu.wstrNodeId = stNode.wstrChildNode;
		stMenu.wstrNodeName = stNode.wstrNodeName;
		vctNode.push_back(stMenu);

        //
        // ******
        //

        bIsRtn = false;
        do	
        {
            bool bIsFind = false;
			ST_NODE stMinorNode;

			if (majorStack.empty())
			{
				break;
			}

			wstrMajorNode = majorStack.top();
			if (!minorStack.empty())
			{
				stMinorNode = minorStack.top();
				if (wstrMajorNode == stMinorNode.wstrParentNode)
				{
					bIsFind = true;
				}
			}

            if (!bIsFind)
            {
                majorStack.pop();
				vctNode.pop_back();
            }
            else
			{
				bIsRtn = true;
			}
        } while (!bIsRtn);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuDylan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值