二叉树遍历,先序中序二叉树构造,BFS,完全二叉树构造

来源:互联网 发布:pk10北京赛车开奖源码 编辑:程序博客网 时间:2024/06/01 19:56

1.二叉树的遍历


遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点

下面是代码

void BinaryTree::preOrder(void (*visite)(BinaryTree::Node*), Node* t) {    if (t) {        visite(t);        preOrder(visite, t->left);        preOrder(visite, t->right);    }}void BinaryTree::inOrder(void (*visite)(BinaryTree::Node*), Node* t) {    if (t) {        inOrder(visite, t->left);        visite(t);        inOrder(visite, t->right);    }}void BinaryTree::postOrder(void (*visite)(BinaryTree::Node*), Node* t) {    if (t) {        postOrder(visite, t->left);        postOrder(visite, t->right);        visite(t);    }}

2. 先序中序二叉树构造


BinaryTree::Node* creatTree(std::vector<char>::iterator preOrder, std::vector<char>::iterator inOrder, int n) {    std::vector<char>::iterator p1, p2;    int i;    if (n <= 0) {        return NULL;    }    BinaryTree::Node* root = NULL;    root = new BinaryTree::Node(*preOrder, NULL, NULL);    i = 0;    std::vector<char>::iterator temp = inOrder;    while (i < n) {        if (*preOrder == *temp) break;        ++temp;        ++i;    }    p1 = (preOrder + 1);    p2 = inOrder;    root->left = creatTree(p1, p2, i);    p1 = (preOrder + i + 1);    p2 = (inOrder + i + 1);    root->right = creatTree(p1, p2, n - i - 1);    return root;}// created by preorder and inorderBinaryTree::BinaryTree(const std::vector<char>& preOrder,                       const std::vector<char>& inOrder) {    if (!preOrder.empty() && !inOrder.empty()) {        std::vector<char> copy1(preOrder);        std::vector<char> copy2(inOrder);        std::vector<char>::iterator p1 = copy1.begin();        std::vector<char>::iterator p2 = copy2.begin();        int n = preOrder.size();        root = creatTree(p1, p2, n);    } else {        root = NULL;    }}

BFS


bfs
具体看下面完全二叉树代码

bfs构造完全二叉树


BinaryTree::BinaryTree(std::vector<char> & Vec) {    int i = 0;    if (!Vec.empty()) {        std::queue<BinaryTree::Node**> q;        while (!q.empty()) q.pop();        q.push(&root);        while (!q.empty()) {            if (Vec[i] != EMPTY_ELE) {                *q.front() = new Node(Vec[i], NULL, NULL);                q.push(&(*q.front())->left);                q.push(&(*q.front())->right);            }            i++;            q.pop();        }    } else {        root = NULL;    }}

最后是完整作业代码


main.cpp

#include <iostream>#include "BinaryTree.hpp"using namespace std;void print(BinaryTree::Node * temp) {    cout << temp->val << " ";}std::vector<char> pre;std::vector<char> in;void getPreOrder(BinaryTree::Node * temp) {    pre.push_back(temp->val);}void getInOrder(BinaryTree::Node * temp) {    in.push_back(temp->val);}void testTree() {    cout << "test Tree" << endl;    int n = 1;    std::vector<char> tree;    cin >> n;    while (n--) {        char temp = '\0';        cin >> temp;        tree.push_back(temp);    }    BinaryTree x = BinaryTree(tree);    BinaryTree::preOrder(print, x.getRoot());    cout << endl;    BinaryTree::inOrder(print, x.getRoot());    cout << endl;    BinaryTree::postOrder(print, x.getRoot());    cout << endl;    BinaryTree::preOrder(getPreOrder, x.getRoot());    BinaryTree::inOrder(getInOrder, x.getRoot());    BinaryTree t = BinaryTree(pre, in);    BinaryTree::postOrder(print, t.getRoot());    cout << endl;    BinaryTree y = BinaryTree(t);    BinaryTree::preOrder(print, y.getRoot());    cout << endl;    BinaryTree::inOrder(print, y.getRoot());    cout << endl;    BinaryTree::postOrder(print, y.getRoot());    BinaryTree::preOrder(getPreOrder, y.getRoot());    BinaryTree::inOrder(getInOrder, y.getRoot());}int main() {    testTree();}

BinaryTree.hpp

#ifndef BinaryTree_hpp#define BinaryTree_hpp#include <iostream>#include <vector>#include <queue>#include <stack>#define EMPTY_ELE '#'class BinaryTree {public:    struct Node {        char val;        Node* left;        Node* right;        Node(char v, Node* l = NULL, Node* r = NULL):        val(v), left(l), right(r) {        }    };    BinaryTree(const BinaryTree&);    BinaryTree(std::vector<char>&);    // created by preorder and inorder    BinaryTree(const std::vector<char>& preOrder,               const std::vector<char>& inOrder);    ~BinaryTree();    Node* getRoot() const;    void clear();    static void preOrder(void (*visite)(BinaryTree::Node*), Node*);    static void inOrder(void (*visite)(BinaryTree::Node*), Node*);    static void postOrder(void (*visite)(BinaryTree::Node*), Node*);private:    Node * copyNode(Node * oldNode, Node * newNode);    Node * root;};#endif /* BinaryTree_hpp */

BinaryTree.cpp

#include "BinaryTree.hpp"#include <queue>#include <iterator>BinaryTree::BinaryTree(const BinaryTree& othBT) {    root = NULL;    root = copyNode(othBT.getRoot(), root);}BinaryTree::BinaryTree(std::vector<char> & Vec) {    int i = 0;    if (!Vec.empty()) {        std::queue<BinaryTree::Node**> q;        while (!q.empty()) q.pop();        q.push(&root);        while (!q.empty()) {            if (Vec[i] != EMPTY_ELE) {                *q.front() = new Node(Vec[i], NULL, NULL);                q.push(&(*q.front())->left);                q.push(&(*q.front())->right);            }            i++;            q.pop();        }    } else {        root = NULL;    }}BinaryTree::Node* creatTree(std::vector<char>::iterator preOrder,                            std::vector<char>::iterator inOrder, int n) {    std::vector<char>::iterator p1, p2;    int i;    if (n <= 0) {        return NULL;    }    BinaryTree::Node* root = NULL;    root = new BinaryTree::Node(*preOrder, NULL, NULL);    i = 0;    std::vector<char>::iterator temp = inOrder;    while (i < n) {        if (*preOrder == *temp) break;        ++temp;        ++i;    }    p1 = (preOrder + 1);    p2 = inOrder;    root->left = creatTree(p1, p2, i);    p1 = (preOrder + i + 1);    p2 = (inOrder + i + 1);    root->right = creatTree(p1, p2, n - i - 1);    return root;}// created by preorder and inorderBinaryTree::BinaryTree(const std::vector<char>& preOrder,                       const std::vector<char>& inOrder) {    if (!preOrder.empty() && !inOrder.empty()) {        std::vector<char> copy1(preOrder);        std::vector<char> copy2(inOrder);        std::vector<char>::iterator p1 = copy1.begin();        std::vector<char>::iterator p2 = copy2.begin();        int n = preOrder.size();        root = creatTree(p1, p2, n);    } else {        root = NULL;    }}BinaryTree::~BinaryTree() {    if (root != NULL) {        clear();    }}BinaryTree::Node* BinaryTree::getRoot() const {    return root;}void BinaryTree::clear() {    if (root != NULL) {        std::queue<Node**> q;        while (!q.empty()) q.pop();        if (root != NULL) {            Node *p[1000];            int i = 0;            q.push(&root);            while (!q.empty()) {                if (*q.front() != NULL) {                    if ((*q.front())->left)                        q.push(&(*q.front())->left);                    if ((*q.front())->right)                        q.push(&(*q.front())->right);                }                if (*q.front() != NULL) {                    p[i++] = *q.front();                    q.pop();                } else {                    q.pop();                }            }            for (int j = 0; j < i; j++) {                delete p[j];            }        }    }}void BinaryTree::preOrder(void (*visite)(BinaryTree::Node*), Node* t) {    if (t) {        visite(t);        preOrder(visite, t->left);        preOrder(visite, t->right);    }}void BinaryTree::inOrder(void (*visite)(BinaryTree::Node*), Node* t) {    if (t) {        inOrder(visite, t->left);        visite(t);        inOrder(visite, t->right);    }}void BinaryTree::postOrder(void (*visite)(BinaryTree::Node*), Node* t) {    if (t) {        postOrder(visite, t->left);        postOrder(visite, t->right);        visite(t);    }}BinaryTree::Node * BinaryTree::copyNode(Node * oldNode, Node * newNode) {    if (oldNode != NULL) {        newNode = new Node(oldNode->val);        newNode->left = copyNode(oldNode->left, newNode->left);        newNode->right = copyNode(oldNode->right, newNode->right);    }    return newNode;}
0 0
原创粉丝点击