(검지 Offer) 면접 문제 25: 두 갈래 트리 중 한 가지 값의 경로
3045 단어 면접 문제
제목:
두 갈래 트리와 정수를 입력하고 두 갈래 트리의 결점 값과 정수를 입력하기 위한 모든 경로를 출력합니다.경로는 나무의 뿌리 결점에서 시작하여 잎 결점까지 내려가는 결점으로 경로를 형성합니다.
두 갈래 나무 결점의 정의:
struct TreeNode{
int val;
TreeNode* left;
TreeNode* right;
};
생각:
전형적인 소급법 문제는 주로 귀속과 가지치기 두 부분으로 나뉜다.
귀속:
현재 결점이 비어 있지 않고 결점의 값이 기대치보다 작으면 이 결점을 경로vector에 눌러 넣고 좌우 결점에서 아래로 계속 훑어보십시오.
if(root->left) FindPath(root->left,result,path,expectedNumber-root->val); if(root->right) FindPath(root->right,result,path,expectedNumber-root->val);
반복 종료 조건:
잎 노드를 두루 돌아다니고 이 잎 결점의 값이 기대치와 같으면 이것은 만족스러운 경로이다.
가지치기:
만약 현재 결점의 값이 기대치보다 크다면 아래로 훑어보는 것은 의미가 없기 때문에 되돌아와 쓸데없는 계산을 피한다.
코드:
void FindPath(TreeNode* pRoot,vector<int> &path,int expectedSum){
if(pRoot->val>expectedSum)
return;
path.push_back(pRoot->val);
if(pRoot->left==NULL && pRoot->right==NULL && pRoot->val==expectedSum){
printf("A path is found: ");
for(std::vector<int>::iterator it=path.begin();it!=path.end();it++)
printf("%d\t",*it);
printf("
");
return;
}
if(pRoot->left)
FindPath(pRoot->left,path,expectedSum-pRoot->val);
if(pRoot->right)
FindPath(pRoot->right,path,expectedSum-pRoot->val);
path.pop_back();
}
void FindPath(TreeNode* pRoot,int expectedSum){
if(pRoot==NULL)
return;
std::vector<int> path;
FindPath(pRoot,path,expectedSum);
}
온라인 테스트 OJ:
http://www.nowcoder.com/books/coding-interviews/b736e784e3e34731af99065031301bca?rp=1
AC 코드:
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<vector<int> > result;
if(root==NULL)
return result;
vector<int> path;
FindPath(root,result,path,expectNumber);
return result;
}
void FindPath(TreeNode* root,vector<vector<int> > &result,vector<int> &path,int expectedNumber){
if(root->val>expectedNumber)
return;
path.push_back(root->val);
bool isLeaf=root->left==NULL && root->right==NULL;
if(isLeaf && root->val==expectedNumber){
result.push_back(path);
path.pop_back();
return;
}
if(root->left)
FindPath(root->left,result,path,expectedNumber-root->val);
if(root->right)
FindPath(root->right,result,path,expectedNumber-root->val);
path.pop_back();
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 프로그래머 면접에서의 다중 스레드 문제 요약wait ()/notify ()/notify All () 의 모든 방법을 호출할 때, 현재 라인이 이 대상의 자물쇠를 얻지 못하면, Illegal MonitorState Exception의 이상을 던집니다. Thre...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.