학습 노트 (5) - 트리 ADT
10093 단어 데이터 구조와 알고리즘
1. 정의
두 갈래 나무는 한 그루의 나무로 그 중 노드마다 두 아들보다 많을 수 없다.
2. 실현
typedef struct TreeNode *PtrToNode;
typedef PtrToNode Tree;
typedef char ElementType;
struct TreeNode
{
ElementType Element;
Tree Left;
Tree Right;
};
3. 후차 표현식을 통해 표현식 트리를 구성한다
void bianli(Tree t)
{
if (t)
{
bianli(t->Left);
cout << t->Element << " ";
bianli(t->Right);
}
}
int main()
{
char c;
stack<Tree> treeStack;
while (1)
{
cout << "Please enter a suffix expression!(the last must is ';')" << endl;
cin >> c;
if (c == ';')
{
break;
}
else
{
if (c == '+' || c == '-' || c == '*' || c == '/')
{
auto t2 = treeStack.top();
treeStack.pop();
auto t1 = treeStack.top();
treeStack.pop();
PtrToNode temp2 = new(struct TreeNode);
temp2->Element = c;
temp2->Left = t1;
temp2->Right = t2;
treeStack.push(temp2);
}
else
{
PtrToNode temp;
temp = new(struct TreeNode);
temp->Element = c;
temp->Left = temp->Right = nullptr;
treeStack.push(temp);
}
}
}
auto t = treeStack.top();
bianli(t);
return 0;
}
2. 트리 찾기 ADT
1. 정의
트리의 각 노드 X의 경우 왼쪽 트리의 모든 키워드 값은 X의 키워드 값보다 작고 오른쪽 트리의 모든 키워드 값은 X의 키워드 값보다 큽니다.
2. 실현
#ifndef _Tree_H
#define _Tree_H
// ~
struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;
typedef int ElementType;//
//
SearchTree MakeEmpty(SearchTree T);
Position Find(SearchTree, ElementType X);
Position FindMin(SearchTree T);
Position FindMxa(SearchTree T);
SearchTree Insert(ElementType X, SearchTree T);
SearchTree Delete(ElementType X, SearchTree T);
ElementType Retrieve(Position P);
#endif // !_Tree_H
struct TreeNode //
{
ElementType Element;
SearchTree Left;
SearchTree Right;
};
3. 관련 방법의 실현
(1) 비워~
비우기 위해서는 뒷차례를 반복하는 방법을 사용해야 한다. 뒷차례를 옮겨야만 모든 나무를 다 정리할 수 있기 때문이다.
SearchTree MakeEmpty(SearchTree T)
{
if (T)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
delete(T);
}
return nullptr;
}
(2) 찾기
결점보다 작은 것은 좌자나무를 찾으러 가고, 큰 것은 우자나무를 찾으러 간다
Position Find(SearchTree T, ElementType X)
{
if (T)
{
if (T->Element == X)
{
return T;
}
else if (T->Element>X)
{
return Find(T->Left, X);
}
else
{
return Find(T->Right, X);
}
}
return nullptr;
}
(3) 가장 작은 것을 찾다
한 가지 방법은 마지막 결점까지 끊임없이 왼쪽 나무를 찾아가는 것이다.
Position FindMin(SearchTree T)
{
if (T)
{
if (T->Left == nullptr)
{
return T;
}
else
{
return FindMin(T);
}
}
else
{
return nullptr;
}
}
(3) 가장 큰 것을 찾다
물론 이런 간단한 귀속은 for순환 하나로 해결할 수 있다.
Position FindMax(SearchTree T)
{
if (T != nullptr)
{
while (T->Right != nullptr)
{
T = T->Right;
}
}
return T;
}
(4) 삽입
//SearchTree Insert(ElementType X, SearchTree T) {if (T==nullptr)//빈 트리를 삽입하면 {T = new (struct TreeNode), if (T=nullptr) {cout << Out of Space!>endl; } else { T->Element = X; T->Left = T->Right = nullptr; } } else if (T->Element < X) { T->Left = Insert(X, T->Left); } else if (T->Element>X) { T->Right = Insert(X, T->Right);} else//와 같은 말은 이미 있다는 것을 나타낸다 {cout << "It has existed!"
(5) 삭제
//SearchTree Delete 삭제(ElementType X, SearchTree T) {if (T==nullptr)//빈 트리를 찾으면 멈추기 {cout << "Element not found!"
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
두 갈래 나무의 깊이가 두루 다니다텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.