C++ N叉樹的實現


引言

最近一個項目需要使用多叉樹結構來存儲數據,但是基於平時學習的都是二叉樹的結構,以及網上都是二叉樹為基礎來進行學習,所以今天實現一個多叉樹的數據結構。

理論基礎

樹和二叉樹

多叉樹:多叉樹,顧名思義,就是一個節點可能有若干個子節點,構造的一個較為復雜的樹結構。

樹的遍歷:樹的遍歷一般認為有三種:前序遍歷二叉樹、中序遍歷二叉樹、后序遍歷二叉樹\(^{[2]}\)

(1). 前序遍歷二叉樹。若二叉樹為空,則為空操作,返回空否則訪問根結點-->前序遍歷左子樹-->前序遍歷右子樹。

(2). 中序遍歷二叉樹。 若二叉樹為空,則為空操作,返回空否則中序遍歷左子樹-->訪問根結點-->中序遍歷右子樹。

(3). 后序遍歷二叉樹。若二叉樹為空,則為空操作,返回空否則后序遍歷左子樹-->后序遍歷右子樹-->訪問根結點。

本文特別強調:本文只有兩種遍歷方法,先根遍歷和先葉遍歷,先根遍歷是首先遍歷根節點,然后訪問按順序從左到右遍歷子節點;先葉遍歷指首先按照順序從左至右遍歷葉子節點,然后遍歷根節點。

C++指針: 指針即為地址,一個指針對應一個地址,*p = &a \(^{[3-4]}\),其中a保存的是變量值,具體數據,*p 或者 &a表示的是一個地址編號,比如:0x80651165,即:a = 5p = 0x80651165,一句話描述,變量存儲的是數據,指針存放的是地址,通過指針可以找到變量存放的位置,從而找到變量的具體值;

結構體:結構體可以理解為一個對象(但是class 和 struct 是有不同之處的),它是一種用戶自定義的數據類型。

基於C++的N叉樹的實現

頭文件:

#include <iostream>
#include <vector>
using namespace std;
#ifndef DBM_MTREE_H
#define DBM_MTREE_H
typedef int T;
typedef struct MNode {
    T element;
    vector<MNode*> children;
    MNode *Parent;
} MNode;

class MTree {
private:
    MNode *root;
public:
    void init(MNode *root);
    void putChild(MNode* node,MNode* parent);
    void putChildren(vector<MNode*> nodes, MNode *parent);
    void tranversal(MNode *root);
    void tranversal();
    int getMaxDepth(MNode *root,vector<MNode*> nodes);
};

實現:

void MTree::init(MNode *root) { this->root = root; }

void MTree::putChild(MNode *node, MNode *parent) {
    parent->children.push_back(node);
    node->Parent = parent;
}

void MTree::putChildren(vector<MNode *> nodes, MNode *parent) {
    for (int i = 0; i < nodes.size(); ++i) {
        putChild(nodes[i], parent);
    }
}

void MTree::tranversal() {
    this->tranversal(this->root);
}

void MTree::tranversal(MNode *root) {
    vector<MNode *> nodes = root->children;
    for (int i = 0; i < nodes.size(); ++i) {
        if (nodes[i]->children.size() > 0)
            tranversal(nodes[i]);
        else
            cout << nodes[i]->element << ",";
    }
    cout << root->element << ",";
}

int MTree::getMaxDepth(MNode *root,vector<MNode*> nodes) {
    auto iResult = 0;

    return iResult;
}

源碼:Gitee | Github | CSDN

實驗驗證

本章小結

學習數據結構一定是從思想角度去理解算法和數據結構的意義,而不要僅僅局限於某一種數據結構和算法,將一種算法和結構擴展化、實踐化才是學習數據結構的根本目的,鍛煉自己對問題建模的能力。

參考文獻

[1]. 樹和二叉樹的定義

[2]. 二叉樹遍歷算法總結

[3]. C++指針詳解

[4]. C/C++指針詳解之基礎篇(史上最全最易懂指針學習指南!!!!)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM