二叉树的实现(c++实现)

先上代码:
头文件

//delete操作暂时还没完全实现 有时间再补上

//
// Created by Hasee on 2021/4/4.
//

#ifndef C__CODE_BASEBINARYTREE_H
#define C__CODE_BASEBINARYTREE_H
using std::cout;
template<class T>
struct BTNode{
    T data;
    BTNode<T>* left;
    BTNode<T>* right;

    BTNode(){
        left= nullptr;
        right= nullptr;
    }

    BTNode(T &item,BTNode<T>*l= nullptr,BTNode<T>*r= nullptr){
        left=l;
        right=r;
        data=item;
    }
};

template<class T>
class Tree{
private:
     BTNode<T>* root;
protected:
    void makeempty(BTNode<T>*ptr);

    BTNode<T>* rlLocate(T node_value,BTNode<T>*ptr);//递归定位要插入的节点

    bool rlDelete(BTNode<T>* ptr,T x=0);

    void rprint(BTNode<T>*ptr);//递归打印

public:
    Tree(){
    root=new BTNode<T>;
}
    Tree(T item){
    root=new BTNode<T>(item);
}
    ~Tree(){
    makeempty(root);
}
    bool Insert(T x,int lr=0,T value=0);
    bool Delete(T del_node_value);

    BTNode<T>* Locate(T value);

    void output();

};

template<class T>
void Tree<T>::makeempty(BTNode<T>*ptr) {
    if(!ptr)return;
    if(ptr->left)makeempty(ptr->left);
    if(ptr->right)makeempty(ptr->right);
    delete ptr;
}

template<class T>
bool Tree<T>::Insert(T x, int lr, T value) {
    if(!Locate(value))return false;
    BTNode<T>* current=rlLocate(value,root);
    if(lr==0){
        if(!current->left)
        {
            current->left=new BTNode<T>(x);return true;
        }
        else  return false;
    } else if(lr==1){
        if(!current->right){
            current->right=new BTNode<T>(x);
            return true;
        } else return false;
    }
    return false;
}

template<class T>
bool Tree<T>::Delete(T del_node_value) {
    if(!rlLocate(del_node_value,root))return false;

    if(rlDelete(root,del_node_value))return true;
    else return false;
}

template<class T>
BTNode<T> *Tree<T>::Locate(T value) {
    return rlLocate(value,root);
}

template<class T>
BTNode<T> *Tree<T>::rlLocate(T node_vaule,BTNode<T> *ptr) {
    if(!ptr)return nullptr;
     if(ptr->data==node_vaule)return ptr;
     BTNode<T>*locate=rlLocate(node_vaule,ptr->left);
     return locate ? locate:rlLocate(node_vaule,ptr->right);
}

template<class T>
bool Tree<T>::rlDelete(BTNode<T> *ptr,T x) {
    if(!ptr)return false;
    if(ptr->data==x) return true;
    if(ptr->left)rlDelete(ptr->left,x);
    if(ptr->right)rlDelete(ptr->right,x);
    return false;
}

template<class T>
void Tree<T>::output() {
    rprint(root);
}

template<class T>
void Tree<T>::rprint(BTNode<T> *ptr) {
    if(!ptr)return;
    if(ptr->left)rprint(ptr->left);
    if(ptr->right)rprint(ptr->right);
    cout<<ptr->data<<"-> "<<" ";
}


#endif //C__CODE_BASEBINARYTREE_H

main函数调用实现插入与输出

#include <iostream>
#include "BaseBinaryTree.h"
int main(){
        Tree<int>test(1);
        test.Insert(2,0,1);
        test.Insert(3,1,1);
        test.Insert(4,0,2);
        test.Insert(5,1,2);
        test.Insert(6,0,3);
        test.Insert(7,1,3);
        test.Insert(7,1,3);//插入不进去

        test.output();
}

在这里插入图片描述

实现思想:

使用结构体实现结点的三个基本结构:左右指针域以及数据域;
通过root指针对树进行遍历;
递归的查找节点。

图片显示更直观:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值