검지offer-서열화 두 갈래 나무
6893 단어 검지offer
문제.
제목: [검지offer-서열화된 두 갈래 나무]
사고의 방향
먼저 말하자면, 아래의 코드는 없었지만, 사고방식은 옳았다.나는 서열이 반드시 완전한 두 갈래 나무의 형식을 제시해야만 내가 정확한 다음 표를 계산할 수 있다고 요구한다.하지만 제목을 서열화할 때는 이렇게 주지 않는다.나는 몇몇 인터넷 방법을 참고했는데, 모두가 서열화라는 물건에 대해 모두 자신의 정의를 가지고 있다.
본질은 완전 두 갈래 나무 서열에 따라 구축한 다음에 넓이를 우선적으로 훑어보는 것이다.
코드
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
char* Serialize(TreeNode *root) {
if(!root) return NULL;
string ret;
ret += (char)('0'+root->val);
queue que;
que.push(root);
while(!que.empty()){
root = que.front();
que.pop();
if( root->left ){
ret += (char)('0'+root->left->val);
que.push(root->left);
}
else
ret += '#';
if(root->right){
ret += (char)('0'+root->right->val);
que.push(root->right);
}
else
ret += '#';
}
int sz = ret.size();
int idx = sz - 1;
while(ret[idx]=='#') --idx;
string tmp = ret.substr(0, idx+1);
return const_cast<char*>(tmp.c_str());
}
TreeNode* Deserialize(char *str) {
if(!str) return NULL;
return create_bitree( str, 0, strlen(str)-1 );
}
private:
TreeNode* create_bitree(char* str, int cur, int n){
if( cur > n ) return NULL;
if( str[cur] == '#' ) return NULL;
TreeNode* root = new TreeNode( str[cur] - '0' );
root->left = create_bitree( str, cur*2+1, n );
root->right = create_bitree( str, cur*2 + 2, n );
return root;
}
};
생각 2
오늘 이 문제를 다시 풀었는데도 여전히 풀리지 않았다.어제 말미에 나는 사람들이 서열화된 서열에 대해 서로 다른 정의를 가지고 있기 때문에 다른 방법을 만들었을 것이라고 생각했다.오늘 나는 먼저 순서를 두루 훑어보는 방법을 채택하여 서열화를 만들었다.왼쪽 트리가 비어 있지만 오른쪽 트리가 비어 있지 않을 경우 # 추가
코드
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
char* Serialize(TreeNode *root) {
string ans;
pre_order( root, ans );
return const_cast<char*>( ans.c_str() );
//return ans;
}
TreeNode* Deserialize(char *str) {
if( !str ) return NULL;
int cur = 0;
int n = strlen(str);
return create_bitree( str, cur, n );
}
private:
TreeNode* create_bitree(char* arr, int& cur, int n){
if( cur >= n || arr[cur] == '#' ) return NULL;
else{
TreeNode* root = new TreeNode( arr[cur] ); ++cur;
root->left = create_bitree( arr, cur, n );
root->right = create_bitree( arr, cur, n );
return root;
}
}
int pre_order(TreeNode* root, string& ans){
if(!root) return -1;
else{
ans += static_cast<char>(root->val);
int ret = pre_order( root->left, ans );
if(-1==ret && root->right){
ret+='#';
}
pre_order( root->right, ans );
return 0;
}
}
};
이것은 지나친 링크입니다 [검지offer 서열화 두 갈래 나무]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
20200326 - 검지offer 면접문제 27: 두 갈래 나무의 거울이솔 위 안에 28문제의 답안이 있는데 어떻게 꼬치는지 모르겠다.간단해....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.