검지 Offer 시리즈 - 면접 문제 6: 이 진 트 리 재건
5661 단어 검지 제공
코드 는 다시 쓰 지 않 았 으 며 15 년 가을 데이터 구조의 OJ 문제 로 맨손으로 쓴 대기 열 과 이 진 트 리 류 입 니 다.
#include
using namespace std;
/***********************************Queue******************************/
template
struct LinkNode
{
T data;
LinkNode *next;
LinkNode(LinkNode *top = NULL)
{
next = top;
}
LinkNode(T elem,LinkNode *top = NULL)
{
data = elem;
next = top;
}
};
template
class Queue
{
private:
LinkNode *first,*rear;
public:
Queue()
{
rear = first = new LinkNode;
}
~Queue()
{
makeEmpty();
}
bool EnQueue(const T& elem)
{
LinkNode* newNode = new LinkNode(elem);
if(!newNode)
return false;
if(IsEmpty())
first->next = rear = newNode;
rear->next=newNode;
rear=rear->next;
return true;
}
bool DeQueue(T& elem)
{
LinkNode* del;
if(first==rear)
return false;
del=first->next;
elem=del->data;
first->next=del->next;
if(first->next==NULL)
rear=first;
delete del;
return true;
}
bool IsEmpty()
{
return (first == rear)? true:false;
}
void makeEmpty()
{
LinkNode *p = first->next;
if(!p)
return;
while(first->next)
{
first = p->next;
delete p;
p = first->next;
}
}
};
/*********************************BinaryTree***************************/
template
struct BinTreeNode
{
T data;
BinTreeNode *lchild, *rchild;
BinTreeNode()
{
lchild = NULL;
rchild = NULL;
}
BinTreeNode(T x, BinTreeNode* l = NULL, BinTreeNode* r = NULL)
{
data = x;
lchild = l;
rchild = r;
}
};
template
class BinaryTree
{
private:
BinTreeNode* root;
void destroy(BinTreeNode* root)
{
if(root)
{
destroy(root->lchild);
destroy(root->rchild);
delete root;
}
}
public:
BinaryTree()
{
root = NULL;
}
BinaryTree(BinTreeNode* p)
{
root = p;
}
BinaryTree(T *elems, int n) /// , ,
{
root = new BinTreeNode [n];
for(int i=0; i& a);
~BinaryTree()
{
}
BinTreeNode *visitRoot()
{
return root;
}
bool isEmpty()
{
return (root == NULL)?true:false;
}
BinTreeNode *Parent(BinTreeNode* current)
{
return (root == NULL || root == current)?NULL:Parent(root,current);
}
BinTreeNode *LeftChild(BinTreeNode* current)
{
return (current != NULL)?current->lchild:NULL;
}
BinTreeNode *RightChild(BinTreeNode* current)
{
return (current != NULL)?current->rightChild:NULL;
}
void PreOrder(BinTreeNode* p = visitRoot()) ///
{
if(p)
{
cout << p->data << " ";
PreOrder(p->lchild);
PreOrder(p->rchild);
}
}
void InOrder(BinTreeNode* p = visitRoot()) ///
{
if(p)
{
InOrder(p->lchild);
cout << p->data << " ";
InOrder(p->rchild);
}
}
void PostOrder(BinTreeNode* p = visitRoot()) ///
{
if(p)
{
PostOrder(p->lchild);
PostOrder(p->rchild);
cout << p->data << " ";
}
}
void LevelOrder(BinTreeNode* p) ///
{
Queue*> q;
BinTreeNode* pre = root;
q.EnQueue(pre);
cout << pre->data << " ";
while(!q.IsEmpty())
{
q.DeQueue(pre);
if(pre->lchild != NULL)
{
q.EnQueue(pre->lchild);
cout << pre->lchild->data << " ";
}
if(pre->rchild != NULL)
{
q.EnQueue(pre->rchild);
cout << pre->rchild->data << " ";
}
}
}
};
template
BinTreeNode *CreateBinTree(T* VLR, T* LVR, int n) ///
{
if(n == 0)
return NULL;
int k = 0;
while(VLR[0] != LVR[k])
k++;
BinTreeNode *t = new BinTreeNode(VLR[0]);
t->lchild = CreateBinTree(VLR+1,LVR,k);
t->rchild = CreateBinTree(VLR+k+1,LVR+k+1,n-k-1);
return t;
}
int main()
{
int n = 8;
int a[8] = {1,2,4,7,3,5,6,8}; ///
int b[8] = {4,7,2,1,5,3,8,6}; ///
BinTreeNode *p = CreateBinTree(a,b,n);
BinaryTree tree(p);
tree.LevelOrder(p); ///
cout << endl;
tree.PostOrder(p); ///
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
\ # 데이터 구조 와 알고리즘 학습 노트 \ # 검 지 제공 42: 단어 순 서 를 뒤 집기 + 테스트 사례 (자바, C / C +)2019.1.2 검 지 Offer 는 제로 브러시 개인 노트 정리 (66 문제 전) 디 렉 터 리 전송 문 에서 인터넷 에 서 는 원 서 를 포함 한 많은 방법 이 문장 을 두 번 뒤 집 는 것 이다. 첫 번...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.