두 갈래 나무가 시퀀스를 훑어보는 구해
위에는 두 갈래 나무가 있는데, 그것의 역행 서열은 각각 다음과 같다는 것을 알 수 있다.
순차 반복: ABDECFG
중역: DBEAFCG
후면 순서: DEBFGCA
우리가 알아야 할 것은 두 갈래 나무의 선순 서열과 중순 서열로 유일하게 두 갈래 나무를 확정할 수 있다는 것이다.두 갈래 나무의 뒷차례 서열과 중간 서열도 유일하게 두 갈래 나무를 확정할 수 있다.그러나 선순 시퀀스와 후순 시퀀스만 알면 두 갈래 나무를 유일하게 확정할 수 없다.
둘째, 이미 알고 있는 두 갈래 나무의 선순 서열과 중순 서열, 후순 서열을 구한다.
두 갈래 나무의 선순 서열과 중순 서열로 유일하게 한 그루의 두 갈래 나무를 확정할 수 있기 때문에 유일하게 그 후순을 확정할 수 있다.선차적 역행 서열에서 첫 번째 결점은 반드시 두 갈래 나무의 뿌리 결점이다. 그러나 중차적 역행에서 뿌리 결점은 반드시 중차적 서열을 두 개의 서브 서열로 분할한다. 앞의 서브 서열은 왼쪽 서브 나무의 중차적 서열이고 뒤의 서브 서열은 오른쪽 서브 나무의 중차적 서열이다.이 두 하위 시퀀스의 길이에 따라 선행 시퀀스에서 대응하는 왼쪽 트리 선행 시퀀스와 오른쪽 트리 선행 시퀀스를 찾을 수 있습니다.반면에 왼쪽 트리 순서 서열의 첫 번째 결점은 왼쪽 트리의 뿌리 결점이고 오른쪽 트리 순서 서열의 첫 번째 결점은 오른쪽 트리의 뿌리 결점이다.이렇게 점차적으로 진행하면 유일하게 이 두 갈래 나무를 확정할 수 있다.
C++ 구현:
/*************************************************************************
> File Name: Test.cpp
> Author: SongLee
> E-mail: [email protected]
> Created Time: 2014 03 20 17 11 31
> Personal Blog: http://songlee24.github.io/
************************************************************************/
#include<iostream>
using namespace std;
struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
char elem;
};
TreeNode* PostOrderFromOrderings(char* inorder, char* preorder, int length)
{
if(length == 0)
{
return NULL;
}
TreeNode* node = new TreeNode;
node->elem = *preorder;
int rootIndex = 0;
for(; rootIndex < length; rootIndex++) //
{
if(inorder[rootIndex] == *preorder)
break;
}
node->left = PostOrderFromOrderings(inorder, preorder + 1, rootIndex);
node->right = PostOrderFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1));
cout << node->elem << " "; // ,
return node;
}
int main()
{
char* pre = "ABDECFG";
char* in = "DBEAFCG";
PostOrderFromOrderings(in, pre, 7);
cout << endl;
return 0;
}
셋째, 이미 알고 있는 두 갈래 나무의 후차 서열과 중차 서열은 선차 서열을 구한다.
같은 이치로 두 갈래 나무의 후순 서열과 중순 서열도 유일하게 두 갈래 나무를 확정할 수 있기 때문에 유일하게 선순 역행 서열을 확정할 수 있다.후차 서열의 마지막 결점은 선차 서열의 첫 번째 결점과 같기 때문에 중차 서열을 두 개의 하위 서열로 분할한 후에 유사한 방법으로 귀속적으로 구분할 수 있다.
C++ 구현:
/*************************************************************************
> File Name: Test1.cpp
> Author: SongLee
> E-mail: [email protected]
> Created Time: 2014 03 20 21 56 57
> Personal Blog: http://songlee24.github.io/
************************************************************************/
#include<iostream>
using namespace std;
struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
char elem;
};
TreeNode* PreOrderFromOrderings(char* inorder, char* postorder, int length)
{
if(length == 0)
{
return NULL;
}
TreeNode* node = new TreeNode;
node->elem = postorder[length-1];
int rootIndex = 0;
for(; rootIndex < length; rootIndex++) //
{
if(inorder[rootIndex] == postorder[length-1])
break;
}
cout << node->elem << " "; // ,
node->left = PreOrderFromOrderings(inorder, postorder, rootIndex);
node->right = PreOrderFromOrderings(inorder + rootIndex + 1, postorder + rootIndex, length - (rootIndex + 1));
return node;
}
int main()
{
char* post = "DEBFGCA";
char* in = "DBEAFCG";
PreOrderFromOrderings(in, post, 7);
cout << endl;
return 0;
}
개인 사이트:http://songlee24.github.io/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.