두 갈래 트리 생성과 반복, 귀속과 비귀속 실현

3488 단어
title: 두 갈래 나무의 최대 권한 및 날짜: 2017-09-16 09:32:32 category: 기본 분류
본고는 두 갈래 나무의 가장 큰 권치와

두 갈래 나무의 가장 큰 권한과


본고는 현지에서 비교적 잘생긴 남자 김천대신의 오리지널, 판권 소유, 전재 환영, 본고의 첫 번째 주소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, 소가 핍박하는 두 갈래 나무 훑어보기 알고리즘은 여기서 끝난다. 사실 당신이 완전히 정확한 두 갈래 나무를 쓰거나 훑어보기를 원하지 않을 때가 많다. 적어도 이 사상을 배워야 한다. 창고로 어떻게 돌아가는지 모의하는 것이 가장 중요하다.

좋은 웹페이지 즐겨찾기