두 갈래 트리 생성과 반복, 귀속과 비귀속 실현
본고는 두 갈래 나무의 가장 큰 권치와
두 갈래 나무의 가장 큰 권한과
본고는 현지에서 비교적 잘생긴 남자 김천대신의 오리지널, 판권 소유, 전재 환영, 본고의 첫 번째 주소https://jinfagang.github.io .하지만 이 판권 정보를 보류해 주십시오. 협조해 주셔서 감사합니다. 어떤 의문이 있으면 위챗을 통해 저에게 연락하여 교류해 주십시오jintianiloveu
두 갈래 나무의 비귀환이 두루 다니다
두 갈래 나무가 차례로 옮겨다니면 아주 간단합니다. 앞의 순서에서 뒤의 순서를 마음대로 골라 옮겨다니면 됩니다.두 갈래 나무를 만들어 봅시다.#include
#include
#include
#include
using namespace std;
struct BiTreeNode {
int data;
BiTreeNode *left_child;
BiTreeNode *right_child;
};
void create_tree(BiTreeNode* &tree) {
int data;
cin >> data;
if (data != '
') {
if (data == -1) {
tree = nullptr;
} else {
tree = new BiTreeNode;
tree->data = data;
create_tree(tree->left_child);
create_tree(tree->right_child);
}
}
}
예를 들어 우리는 이런 두 갈래 나무가 있다. 2
/ \
3 4
/
5
이렇게 간단한 두 갈래 나무는 한 번에 입력한다.2 3 5 -1 -1 -1 4 -1 -1
주의, 먼저 모든 왼쪽 나무를 입력한 다음에 오른쪽 나무는 왼쪽 아이의 -1로 표시하지 않습니다.이때 나무가 세워졌다.그리고 우리는 앞의 순서를 두루 훑어보았다.void pre_order_traverse(BiTreeNode* &tree) {
//
if (tree) {
cout << tree->data << " ";
pre_order_traverse(tree->left_child);
pre_order_traverse(tree->right_child);
}
}
결과는 다음과 같습니다.2 3 5 4
전혀 틀리지 않습니다.void in_order_traverse(BiTreeNode* &tree) {
//
if (tree) {
in_order_traverse(tree->left_child);
cout << tree->data << " ";
in_order_traverse(tree->right_child);
}
}
결과:5 3 2 4
가장 중요한 것은 우리가 어떻게 비귀속의 두 갈래 나무를 두루 돌아다니는 것을 실현할 수 있습니까?void pre_order_traverse_no_recurse(BiTreeNode* &tree) {
//
stack s;
BiTreeNode *p = tree;
// p
while (p != nullptr || !s.empty()) {
while ( p != nullptr) {
cout << p->data << " ";
s.push(p);
p = p->left_child;
}
if (!s.empty()) {
p = s.top();
s.pop();
p = p->right_child;
}
}
}
먼저 우리는 뿌리 노드에서 왼쪽 나무를 따라 계속 돌아다녀야 한다. 이때 매번 돌아다닐 때마다 p를 창고에 넣어서 뒤에 있는 왼쪽 나무를 다 돌아다닌 후에 그 노드의 오른쪽 나무를 계속 돌아다녀야 한다.즉, 두 단계로 나뉘는데 첫 번째 단계는 왼쪽을 훑어보는 것이다. 이것은 앞의 훑어보는 기본 원칙이다. 노드와 우선하고 그 다음은 왼쪽 나무이다. 마지막으로 창고가 비어 있지 않으면 하나씩 이전의 노드를 창고 꼭대기에서 꺼낸 다음에 하나를 꺼내서 하나를 던져 오른쪽 노드를 얻는다. 오른쪽 노드도 왼쪽 나무 조작을 실행하고 최종적으로 비귀환 훑어보는 것을 완성한다.반복적으로 반복되지 않는 중차원 반복 실현도 대동소이하다.void in_order_traverse_no_recurse(BiTreeNode* &tree) {
stack s;
BiTreeNode *p = tree;
while (p != nullptr || !s.empty()) {
while ( p != nullptr) {
s.push(p);
p = p->left_child;
}
if (!s.empty()) {
p = s.top();
cout << p->data << " ";
s.pop();
p = p->right_child;
}
}
}
OK, 소가 핍박하는 두 갈래 나무 훑어보기 알고리즘은 여기서 끝난다. 사실 당신이 완전히 정확한 두 갈래 나무를 쓰거나 훑어보기를 원하지 않을 때가 많다. 적어도 이 사상을 배워야 한다. 창고로 어떻게 돌아가는지 모의하는 것이 가장 중요하다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
#include
#include
#include
#include
using namespace std;
struct BiTreeNode {
int data;
BiTreeNode *left_child;
BiTreeNode *right_child;
};
void create_tree(BiTreeNode* &tree) {
int data;
cin >> data;
if (data != '
') {
if (data == -1) {
tree = nullptr;
} else {
tree = new BiTreeNode;
tree->data = data;
create_tree(tree->left_child);
create_tree(tree->right_child);
}
}
}
2
/ \
3 4
/
5
2 3 5 -1 -1 -1 4 -1 -1
void pre_order_traverse(BiTreeNode* &tree) {
//
if (tree) {
cout << tree->data << " ";
pre_order_traverse(tree->left_child);
pre_order_traverse(tree->right_child);
}
}
2 3 5 4
void in_order_traverse(BiTreeNode* &tree) {
//
if (tree) {
in_order_traverse(tree->left_child);
cout << tree->data << " ";
in_order_traverse(tree->right_child);
}
}
5 3 2 4
void pre_order_traverse_no_recurse(BiTreeNode* &tree) {
//
stack s;
BiTreeNode *p = tree;
// p
while (p != nullptr || !s.empty()) {
while ( p != nullptr) {
cout << p->data << " ";
s.push(p);
p = p->left_child;
}
if (!s.empty()) {
p = s.top();
s.pop();
p = p->right_child;
}
}
}
void in_order_traverse_no_recurse(BiTreeNode* &tree) {
stack s;
BiTreeNode *p = tree;
while (p != nullptr || !s.empty()) {
while ( p != nullptr) {
s.push(p);
p = p->left_child;
}
if (!s.empty()) {
p = s.top();
cout << p->data << " ";
s.pop();
p = p->right_child;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.