두 갈래 나무 관련 필기시험 문제 (3)
6131 단어 두 갈래 나무
제목: 함수를 실현하여 지그재그 순서에 따라 두 갈래 나무를 인쇄하십시오. 즉, 첫 번째 줄은 왼쪽에서 오른쪽으로, 두 번째 줄은 오른쪽에서 왼쪽으로, 세 번째 줄은 왼쪽에서 오른쪽으로 인쇄합니다.
분석: 두 개의 창고를 사용하여 어떤 층의 결점을 인쇄할 때 다음 층의 자결점을 해당하는 창고에 저장할 수 있다.현재 레이어가 홀수 레이어인 경우 왼쪽 서브노드를 저장한 다음 첫 번째 스택에 오른쪽 서브노드를 저장하고, 짝수 레이어인 경우 왼쪽 서브노드를 두 번째 스택에 저장합니다.
구현 코드 1:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > result;
stack<TreeNode *> stack1,stack2;
if(pRoot!=NULL)
stack1.push(pRoot);
TreeNode *node = NULL;
while(!stack1.empty() || !stack2.empty()){
vector<int> data;
if(!stack1.empty()){
while(!stack1.empty()){
node = stack1.top();
stack1.pop();
data.push_back(node->val);
if(node->left!=NULL)
stack2.push(node->left);
if(node->right!=NULL)
stack2.push(node->right);
}
result.push_back(data);
}
else if(!stack2.empty()){
while(!stack2.empty()){
node = stack2.top();
stack2.pop();
data.push_back(node->val);
if(node->right!=NULL)
stack1.push(node->right);
if(node->left!=NULL)
stack1.push(node->left);
}
result.push_back(data);
}
}
return result;
}
구현 코드 2:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > result;
if(pRoot == NULL)
return result;
bool flag = true;
queue<TreeNode *> q;
q.push(pRoot);
while(!q.empty())
{
int size = q.size();
vector<int> num;
while(size --)
{
TreeNode *cur = q.front();
q.pop();
num.push_back(cur->val);
if(cur->left != NULL)
{
q.push(cur->left);
}
if(cur->right != NULL)
{
q.push(cur->right);
}
}
if(!flag)
{
reverse(num.begin(), num.end());
}
result.push_back(num);
flag = !flag;
}
return result;
}
이..두 갈래 나무를 여러 줄로 인쇄하다
제목: 위에서 아래로 두 갈래 트리를 인쇄하고 같은 층의 결점은 왼쪽에서 오른쪽으로 순서대로 인쇄하며 한 층마다 한 줄을 인쇄한다.
분석: 겹겹이 두 갈래 나무를 훑어보는 것과 비슷하다.
구현 코드:
vector<vector<int> > Print(TreeNode* pRoot)
{
vector<vector<int> > vec;
if(pRoot == NULL)
return vec;
queue<TreeNode*> q;
q.push(pRoot);
while(!q.empty())
{
int lo = 0;
int hi = q.size();
vector<int> c;
while(lo++ < hi)
{
TreeNode *t = q.front();
q.pop();
c.push_back(t->val);
if(t->left)
{
q.push(t->left);
}
if(t->right)
{
q.push(t->right);
}
}
vec.push_back(c);
}
return vec;
}
3. 서열화 두 갈래 나무
분석: 두 갈래 나무의 순서에 따라 뿌리 노드를 먼저 훑어보고 왼쪽 결점, 뒤 오른쪽 노드를 훑어보고'#'에 이르면 왼쪽 결점이나 오른쪽 노드가 NULL이라는 것을 설명한다. 마찬가지로 반서열화도 마찬가지다.
구현 코드:
char* Serialize(TreeNode *root) {
if(root==NULL)
return NULL;
string str;
Serialize1(root,str);
return const_cast<char*>(str.c_str());
}
TreeNode* Deserialize(char *str) {
if(str==NULL||*str=='\0')
return NULL;
int num=0;
return Deserialize1(str,num);
}
void Serialize1(TreeNode *root,string &str)
{
if(root==NULL)
{
str+="#,";
return ;
}
char ch[10];
sprintf(ch,"%d",root->val);
str+=ch;
str+=",";
Serialize1(root->left,str);
Serialize1(root->right,str);
}
TreeNode* Deserialize1(char *str,int &num)
{
int val=0;
if(str[num]=='#')
{
num+=2;
return NULL;
}
while(str[num]!=','&&str[num]!='\0')
{
val=val*10+str[num]-'0';
num++;
}
num++;
TreeNode *root=new TreeNode(val);
root->left=Deserialize1(str,num);
root->right=Deserialize1(str,num);
return root;
}
4. 두 갈래 검색 트리의 K번째 결점
제목: 두 갈래 검색 트리를 정하고 그 중 두 번째로 큰 결점을 찾아보세요.
분석: 중서가 두 갈래 검색 트리를 두루 다니는데 두루 돌아다니는 서열이 점차 증가하기 때문에 중서가 두루 다니면 K의 큰 결점을 찾을 수 있다.
구현 코드:
TreeNode* KthNode(TreeNode* pRoot, unsigned int& k)
{
if(pRoot == NULL || k == 0)
{
return NULL;
}
TreeNode* ret = NULL;
if(pRoot->left != NULL)
{
ret = KthNode(pRoot->left, k);
}
if(ret == NULL)
{
if(k == 1)
{
ret = pRoot;
}
else
{
k--;
}
}
if(ret == NULL && pRoot->right != NULL)
{
ret = KthNode(pRoot->right, k);
}
return ret;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 데이터 구조 2차원 트리의 실현 코드일.두 갈래 트리 인터페이스 2 노드 클래스 3. 두 갈래 나무 구현 이 글을 통해 여러분께 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.