이 진 트 리 의 m 층 K 번 째 노드 인쇄 (재 귀 + 비 재 귀)
7061 단어 알고리즘
설명: 뿌리 노드 는 0 층 에 있 고 각 층 의 첫 번 째 노드 의 아래 표 시 는 0 이다.따라서 이 진 트 리 의 m 층 k 번 째 노드 를 인쇄 하려 면 (들 어 갈 매개 변 수 는 각각: (m - 1) 과 (k - 1) 입 니 다.
#include
using namespace std;
#include
#include
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BiNode, *BiTree;
// ( , , # )
BiTree createBiTree()
{
BiTree T;
char c;
scanf("%c", &c);
if (c == '#')
T = NULL;
else
{
T = new BiNode; // T = (BiTree)malloc(sizeof(BiNode));
T->data = c;
T->lchild = createBiTree();
T->rchild = createBiTree();
}
return T;
}
// , level k 。
// level ( ),k ;( 3 , 2 (2, 1))
int k = 1; // k=1 level 2
int num = 0; // num, level ,num , num==k , 。
void PrintNodeAtLevel(BiTree T , int level)
{
if(T == NULL || level < 0) return;
if(level == 0)
{
if (num == k)
printf("%c
", T->data);
num++;
}
PrintNodeAtLevel(T->lchild , level - 1);
PrintNodeAtLevel(T->rchild , level - 1);
}
// ( ), vector , level k 。
// level ( ),k ;( 3 , 2 (2, 1))
void printNodeAtLevel2(BiTree T, int level, int k) // level ( )
{
if (T == NULL) return;
vector vec;
vec.push_back(T);
int curLevel = 0; // ;( , ; , 0 , 1 )
int cur = 0;
int last = 1;
while (cur < vec.size() && curLevel < level)
{
last = (int)vec.size();
while (cur < last)
{
if (vec[cur]->lchild)
vec.push_back(vec[cur]->lchild);
if (vec[cur]->rchild)
vec.push_back(vec[cur]->rchild);
cur++;
}
curLevel++; // 1
}
// while ,curLevel == level; [cur + k] 。
printf("%c
", vec[cur + k]->data);
}
// ( ), queue , level k 。
// level ( ),k ;( 3 , 2 (2, 1))
void printNodeAtLevel3(BiTree T, int level, int k)
{
if(T == NULL) return;
deque q;
q.push_back(T);
int curLevelNum; //
int curLevel = 0; //
while (q.size() && curLevel < level)
{
curLevelNum = (int)q.size(); // , size() size_type ;
while(curLevelNum-- > 0) //
{
BiTree tmp = q.front();
q.pop_front();
if(tmp->lchild)
q.push_back(tmp->lchild);
if(tmp->rchild)
q.push_back(tmp->rchild);
}
curLevel++; // 1
}
// while ,curLevel == level; k 。
printf("%c
", q[k]->data);
}
int main(int argc, const char * argv[]) {
BiTree T = createBiTree(); //
PrintNodeAtLevel(T, 2); // ( 3 2 )( : , int k = 1 )
// printNodeAtLevel2(T, 2, 1); //
//
// printNodeAtLevel3(T, 2, 1); //
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.