Q25: 두 갈래 트리 중 하나에 해당하는 경로

Q: 두 갈래 트리와 정수를 입력하고 두 갈래 트리의 결점과 정수를 입력하기 위한 모든 경로를 출력합니다.나무의 뿌리 결점에서 시작하여 잎 노드가 지나가는 결점까지 하나의 경로를 형성한다.결점은 다음과 같이 정의됩니다.
struct BinaryTreeNode
{
    int    m_nValue;
    BinaryTreeNode *m_pLeft;
    BinaryTreeNode *m_pRight;
}

이 문제는 바로 두 갈래 나무의 횡단보도이다. 횡단보도 과정에서 수시로 데이터를 기록하고 데이터가 일정한 조건을 만족시킬 때 특정한 동작을 해야 한다.
우리는 자연스럽게 두 갈래 나무의 세 가지 역경을 생각했다. 선근(전서)이 역행하는 역귀의 틀은 다음과 같다.
void PreOrder(BinaryTreeNode *root)
{
	if(!root) return;
	visit(root);
	PreOrder(root->m_pLeft);
	PreOrder(root->m_pRight);
}

정말 서로 다른 요구에 대해visit()는 서로 다른 처리를 할 수 있다. 이곳의 요구는 현재의 결점과 주어진 값과 같는지 판단하는 동시에 하나의 경로(잎결점)를 형성하고 만약에 그렇다면 이 경로를 출력하는 것이다.
void FindPath(BinaryTreeNode *pRoot, int expecteSum, int curSum)
{
    if(!pRoot) return;
	curSum += pRoot->m_nValue;
	path.push_back(pRoot);
	if(curSum == expecteSum && IsLeaf(pRoot))
	{
		std::vector<BinaryTreeNode *>::iterator iter = path.begin();
		while (iter != path.end())
		{
			std::cout << (*iter)->m_nValue << " ";
			++iter;
		}
		std::cout << std::endl;
	}
	if(pRoot->m_pLeft)
	FindPath(pRoot->m_pLeft,expecteSum,curSum);
	if(pRoot->m_pRight)
	FindPath(pRoot->m_pRight,expecteSum,curSum);
	path.pop_back();
}

좋은 웹페이지 즐겨찾기