이 진 트 리 의 옮 겨 다 니 기 + 동 구성 판단
56354 단어 데이터 구조
최근 에 데이터 구조 가 나 무 를 배 웠 으 니 컴퓨터 에서 과거 코드 의 물건 을 꺼 내 복습 해 보 세 요.(지난 5 월 팀 프로 그래 밍 사다리 경기 GPLT 관련 문 제 를 만 났 는데 level 2 에서 이 진 트 리 에 관 한 문 제 를 만 났 는데 아직 배 운 적 이 없다 는 것 을 알 게 되 었 습 니 다. 서둘러 독학 을 하고 다음 코드 를 입력 하 세 요. 대부분의 코드 는 베 낀 것 이거 나 인터넷 에 있 는 것 이 었 습 니 다. 그 때 는 그런 의식 이 없 었 습 니 다. 인용 원 을 제때에 기록 하지 못 했 습 니 다. 죄송합니다.)데이터 구조 에서 나무 라 는 것 도 제 가 가장 철저하게 배 웠 습 니 다. 그때 제 가 열심히 노력 한 것 에 감 사 드 립 니 다. 종이 에 프로 그래 밍, 종이 에 추론 을 한 다음 에 분 산 된 수학 공부, 각종 코드 를 결합 시 켰 습 니 다.
두루
#include
#include
#include
#include
#include
#define MAX 20
#include
#define type char
using namespace std;
//typedef struct BTNode *Position;
//typedef Position btree;
typedef struct BTNode
{
type data;
BTNode* lchild, *rchild;
} btree;
btree* CreateBTree(btree *bt, bool isRoot)
{
char ch;
if (isRoot)
printf("Root: ");
fflush(stdin); /* */
cin>>ch;
fflush(stdin);
if (ch != '#')
{
isRoot = false;
bt = new BTNode;
bt->data = ch;
bt->lchild = NULL;
bt->rchild = NULL;
printf("%c's lchild child is: ", bt->data);
bt->lchild = CreateBTree(bt->lchild, isRoot);
printf("%c's rchild child is: ", bt->data);
bt->rchild = CreateBTree(bt->rchild, isRoot);
}
return bt;
}
void preorder1(btree *node)
{
if(node)
{
cout<<node->data<<" ";
preorder1(node->lchild);
preorder1(node->rchild);
}
}
void preorder2(btree *root)
{
btree* temp;
stack<btree*> S;
temp=root;
while(temp||!S.empty())
{
while(temp)
{
cout<<temp->data<<" ";
S.push(temp);
temp=temp->lchild;
}
if(!S.empty())
{
temp=S.top();
S.pop();
temp=temp->rchild;
}
}
}
void inorder1(btree *node)
{
if(node)
{
inorder1(node->lchild);
cout<<node->data<<" ";
inorder1(node->rchild);
}
}
void inorder2(btree *root)
{
btree* temp;
stack<btree*> S;
temp=root;
while(temp||!S.empty())
{
while(temp)
{
S.push(temp);
temp=temp->lchild;
}
if(!S.empty())
{
temp=S.top();
S.pop();
cout<<temp->data<<" ";
temp=temp->rchild;
}
}
}
void postorder1(btree* node)
{
if(node)
{
postorder1(node->lchild);
postorder1(node->rchild);
cout<<node->data<<" ";
}
}
void postorder2(btree *root)
{
if (!root)
return;
stack<btree*> s;
stack<btree*> output;
s.push(root);
while (!s.empty())
{
btree *curr= s.top();
output.push(curr);
s.pop();
if (curr->lchild)
s.push(curr->lchild);
if (curr->rchild)
s.push(curr->rchild);
}
//cout<
while (!output.empty())
{
cout << output.top()->data << " ";
output.pop();
}
}
void postorder3(btree *root)
{
if (!root)
return;
stack<btree*> s;
s.push(root);
btree *prev = NULL;
while (!s.empty())
{
btree *curr= s.top();
// we are traversing down the tree
if (!prev||prev->lchild== curr|| prev->rchild == curr)
{
if (curr->lchild)
{
s.push(curr->lchild);
}
else if (curr->rchild)
{
s.push(curr->rchild);
}
else
{
cout << curr->data << " ";
s.pop();
}
}
// we are traversing up the tree from the lchild
else if (curr->lchild == prev)
{
if (curr->rchild)
{
s.push(curr->rchild);
}
else
{
cout << curr->data << " ";
s.pop();
}
}
// we are traversing up the tree from the rchild
else if (curr->rchild == prev)
{
cout << curr->data << " ";
s.pop();
}
prev = curr; // record previously traversed node
}
}
void levelorder(btree* root)
{
queue<btree*> q;
btree *temp;
if(!root)
return;
q.push(root);
while(!q.empty())
{
temp=q.front();
q.pop();
cout<<temp->data<<" ";
if(temp->lchild)
q.push(temp->lchild);
if(temp->rchild)
q.push(temp->rchild);
}
return;
}
int height(btree *root)
{
int HL,HR,MAXH;
if(root)
{
HL=height(root->lchild);
HR=height(root->rchild);
MAXH=(HL>HR)?HL:HR;
return (MAXH+1);
}
else
return 0;
}
int main()
{
btree *bt;
bt = CreateBTree(bt, true);//
cout<<" "<<endl;
preorder1(bt);//
cout<<endl;
cout<<" ( )"<<endl;
preorder2(bt);//
cout<<endl;
cout<<" "<<endl;
inorder1(bt);//
cout<<endl;
cout<<" ( )"<<endl;
inorder2(bt);//
cout<<endl;
cout<<" "<<endl;
postorder1(bt);//
cout<<endl;
cout<<" ( )"<<endl;
//postorder2(bt);
postorder3(bt);// 3
cout<<endl;
cout<<" ( )"<<endl;
postorder2(bt);// 2
cout<<endl;
cout<<" "<<endl;
levelorder(bt);//
cout<<endl;
cout<<" ( ): ";
cout<<height(bt)<<endl;//
return 0;
}
동구
이 부분 은 저장 성 빅 데이터 구조 mooc 를 베 낀 것 이다.
#include
#define type char
#define type char
#define MAX 20
using namespace::std;
struct treenode
{
type data;
int lchild;
int rchild;
} tree1[MAX],tree2[MAX];
int buildtree(treenode tree[])
{
bool book[MAX]= {false};
int root;
int N,i;
char left,right;
cin>>N;
if(N)
{
for(i=0; i<N; i++)
{
cin>>tree[i].data>>left>>right;
if(left!='-')
{
tree[i].lchild=left-'0';
book[tree[i].lchild]=1;
}
else
tree[i].lchild=-1;
if(right!='-')
{
tree[i].rchild=right-'0';
book[tree[i].rchild]=true;
}
else
tree[i].rchild=-1;
}
for(i=0; i<N; i++)
if(book[i])
break;
root=i;
return root;
}
else
return -1;
}
bool isomorphic(int R1,int R2)
{
if(R1==-1&&R2==-1)
return true;
if((R1==-1&&R2!=-1)||(R1!=-1&&R2==-1))
return false;
if(tree1[R1].data!=tree2[R2].data)
return false;
if(tree1[R1].lchild==-1&&tree2[R2].lchild==-1)
return isomorphic(tree1[R1].rchild,tree2[R2].rchild);
if(tree1[R1].rchild==-1&&tree2[R2].rchild==-1)
return isomorphic(tree1[R1].lchild,tree2[R2].lchild);
if((tree1[R1].lchild!=-1&&tree2[R2].lchild!=-1)
&&(tree1[tree1[R1].lchild].data==tree2[tree2[R2].lchild].data))
return isomorphic(tree1[R1].lchild,tree2[R2].lchild)
&&isomorphic(tree1[R1].rchild,tree2[R2].rchild);
}
void display(treenode tree[])
{
for(int i=0; tree[i].data!='\0'; i++)
{
cout<<tree[i].data<<" ";
cout<<tree[i].lchild<<" ";
cout<<tree[i].rchild<<endl;
}
return;
}
int main()
{
int root1=buildtree(tree1);
int root2=buildtree(tree2);
if(isomorphic(root1,root2))
cout<<"YES"<<endl;
else
cout<<"No"<<endl;
cout<<"tree1:"<<endl;
display(tree1);
cout<<"tree2:"<<endl;
display(tree2);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.