C++链式存储实现二叉树(附源代码)

文件结构 :

文件名字用途
CmakeList.txtcmake文件
how.md简述思路以及其他说明
main.cpp主测试程序
Tree.cpp核心实现文件
Tree.h

核心头文件

 

Tree.cpp

#include "Tree.h"

BinaryTree ::BinaryTree(int element) {
    rootNode = new TreeNode;
    rootNode->leftChild = nullptr;
    rootNode->rightChild = nullptr;
    rootNode->data  = element;
}

void BinaryTree::destroy(TreeNode * node) {
    if (node != nullptr) {
        destroy(node->leftChild);
        destroy(node->rightChild);
        cout << "remove number " << node->data << endl;
        delete node;
        node = nullptr;
    }
}

BinaryTree::~BinaryTree() {
    destroy(rootNode);
}

void BinaryTree::append(int element, char derection, TreeNode * parents) {
    if (derection == 'r'){
        if (parents->rightChild == nullptr){
            parents->rightChild = new TreeNode{element, nullptr, nullptr};
        } else{
            Waring
        }
    }
    elif (derection == 'l'){
        if (parents->leftChild == nullptr){
            parents->leftChild = new TreeNode {element, nullptr, nullptr};
        } else{
            Waring
        }
    } else{
        P_ERROR
    }
}

void BinaryTree::append(TreeNode *node, char derection, TreeNode *parents) {
    if (derection == 'r'){
        if (parents->rightChild == nullptr){
            parents->rightChild = node;
        } else{
            Waring
        }
    }
    elif (derection == 'l'){
        if (parents->leftChild == nullptr){
            parents->leftChild = node;
        } else{
            Waring
        }
    } else{
        P_ERROR
    }
}

int BinaryTree::getDepth(TreeNode *node) const {
    if (node == nullptr ) return 0;
    else{
        return getDepth(node->leftChild) > getDepth(node->rightChild) ?
        getDepth(node->leftChild)+1 :  getDepth(node->rightChild)+1;
    }
}

Tree.h

#include <iostream>
#include <cstdlib>

using namespace std;
#define ERROR cout << "代码有误!"<<endl;exit(EXIT_FAILURE);
#define Waring cout << "此处已经有子树!"<<endl;
#define P_ERROR cout << "参数必须是 字符 'l' 或者 'r'!\n";
#define elif else if

struct TreeNode {
    int data;
    TreeNode *leftChild;
    TreeNode *rightChild;
};

class BinaryTree {
private:
    void destroy(TreeNode * Node);
public:
    // root node
    TreeNode *rootNode;

    // creation and initialization
    explicit BinaryTree(int element) ;
    ~BinaryTree();

    // append a new Node by direction, l -> left r->right
    void append(TreeNode *node, char derection, TreeNode * parents);

    // create a new node and append the new Node by direction, l -> left r->right
    void append(int element, char derection, TreeNode * parents);

    // get depth
    int getDepth(TreeNode *node) const;
};

main.cpp

#include "Tree.h"

int main(){
    // create a tree like this :
    // attention : N means it is an empty Node;
    /*                      1
     *                  2       3
     *              N     8   5    1
     *          N   N  N  2  N   N   N  7
     *
    */
    BinaryTree aTree(1);
    aTree.append(2, 'l', aTree.rootNode);
    aTree.append(3, 'r', aTree.rootNode);
    aTree.append(8, 'r', aTree.rootNode->leftChild);
    aTree.append(5, 'l', aTree.rootNode->rightChild);
    // This is going to throw an error--此处已经有子树!
    aTree.append(15, 'l', aTree.rootNode->rightChild);
    auto new_node1 = new TreeNode{7, nullptr, nullptr};
    auto new_node2 = new TreeNode{1, nullptr, new_node1};
    aTree.append(new_node2, 'r', aTree.rootNode->rightChild);
    aTree.append(2, 'r', aTree.rootNode->leftChild->rightChild);

    // check the tree's height == 4?
    if (aTree.getDepth(aTree.rootNode) == 4){
        cout << "Yes!Successfully!"<<endl;
    } else{
        Waring
    }
    return 0;
}

终端运行结果

此处已经有子树!
Yes!Successfully!
remove number 2
remove number 8
remove number 2
remove number 5
remove number 7
remove number 1
remove number 3
remove number 1

源代码  :

自己实现的数据结构与算法合集: 自己实现的数据结构与算法合集,使用C或者C++ - Gitee.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

若您有别的建议,请在评论区留言

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值