六、樹和二叉樹--(2)二叉樹的先序遍歷、中序遍歷、後序遍歷

摘自計蒜客:http://www.jisuanke.com/course/35/1394

(一)、先序遍歷

先序遍歷時二叉樹遍歷的一種,對於每個結點,先訪問當前結點,然後訪問結點的左子樹,最後訪問結點的右子樹。在子樹

裏依然按照這個遍歷順序訪問。

#include<iostream>
using namespace std;
class Node {
public:
    int data;
    Node *lchild, *rchild;
    Node(int _data) {
        data = _data;
        lchild = NULL;
        rchild = NULL;
    }
    ~Node() {
        if (lchild != NULL) {
            delete lchild;
        }
        if (rchild != NULL) {
            delete rchild;
        }
    }
    void preorder(){
        cout << data << " ";
        if (lchild != NULL) {
            lchild->preorder();
        }
        if (rchild != NULL) {
            rchild->preorder();
        }
    }
};


class BinaryTree {
private: 
    Node *root;
public:
    BinaryTree() {
        root = NULL;
    }
    ~BinaryTree() {
        if (root != NULL) {
            delete root;
        }
    }
    void build_demo() {
        root = new Node(1);
        root->lchild = new Node(2);
        root->rchild = new Node(3);
        root->lchild->lchild = new Node(4);
        root->lchild->rchild = new Node(5);
        root->rchild->rchild = new Node(6);
    }
    void preorder() {
        root->preorder();
    }
};


int main() {
    BinaryTree binarytree;
    binarytree.build_demo();
    binarytree.preorder();
    cout << endl;
    
    return 0;
}


(二)、中序遍歷

中序遍歷和先序遍歷類似,只是在遍歷順序上有所不同,中序遍歷先訪問當前結點的左子樹,然後訪問當前結點,最後訪問

子樹。如果左右孩子不爲空,則遞歸調用孩子結點的中序遍歷函數。

#include<iostream>
using namespace std;
class Node {
...

public:
    void inorder() {
        if (lchild != NULL) {
            lchild->inorder();
        }
        cout << data << " ";
        if (rchild != NULL) {
            rchild->inorder();
        }
    }
};


class BinaryTree {
...

public:    
    void inorder() {
        root->inorder();
    }
    
};

(三)、後序遍歷

後序遍歷先訪問當前結點的左子樹,然後訪問當前結點的右子樹,最後訪問當前結點。如果當前結點的左右子樹不爲空,則

遞歸調用左右孩子的後序遍歷函數。

#include<iostream>
using namespace std;
class Node {
...

public:
    void postorder() {
        if (lchild != NULL) {
            lchild->postorder();
        }
        if (rchild != NULL) {
            rchild->postorder();
        }
        cout << data << " ";
    }
};
class BinaryTree {
...

public:
    void postorder() {
        root->postorder();
    }
};

發佈了6 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章