【逆向】二叉树的实现

#include <iostream>
#include <windows.h>
using namespace std;

class Monster
{
private:
    string name;
    DWORD id;
    DWORD level;

public:
    BOOL operator<(Monster& m);
    BOOL operator>(Monster& m);
    BOOL operator==(Monster& m);
    VOID operator=(Monster& m);
    friend ostream& operator<<(ostream& out, const Monster& m);
    Monster(DWORD id, string name, DWORD level);
    Monster();
};

VOID Monster:: operator=(Monster& m)
{
    this->id = m.id;
    this->level = m.level;
    this->name = m.name;
}

Monster::Monster()
{
    this->id = 0;
    this->level = 0;
}

Monster::Monster(DWORD id, string name, DWORD level)
{
    this->id = id;
    this->level = level;
    this->name = name;
}

ostream& operator<<(ostream& out, const Monster& m)
{
    out << "怪物的name是:" << m.name << endl;
    out << "怪物的id是:" << m.id << endl;
    out << "怪物的level是:" << m.level << endl;
    out << "************************************************************" << endl;
    return out;
}

BOOL Monster::operator<(Monster& m)
{
    if (this->id < m.id)
    {
        return true;
    }
    else
        return false;
}

BOOL Monster::operator>(Monster& m)
{
    if (this->id > m.id)
    {
        return true;
    }
    else
        return false;
}

BOOL Monster::operator==(Monster& m)
{
    if (this->id == m.id)
    {
        return true;
    }
    else
        return false;
}

template <typename T>
class TreeNode
{
public:
    T element;
    TreeNode<T>* pleft;
    TreeNode<T>* pright;
    TreeNode<T>* p_parent;
    TreeNode<T>(T& element);
    TreeNode<T>();
};

template <typename T>
TreeNode<T>::TreeNode(T& element)
{
    this->element = element;
    this->pleft = nullptr;
    this->pright = nullptr;
    this->p_parent = nullptr;
}

template <typename T>
TreeNode<T>::TreeNode()
{
    this->pleft = nullptr;
    this->pright = nullptr;
    this->p_parent = nullptr;
}

template <typename T>
class BsortTree
{
public:
    BsortTree();
   // ~BsortTree();
    VOID InOrderTraverse(TreeNode<T>* pNode); //中序遍历
    VOID PreOrderTraverse(TreeNode<T>* pNode);//前序遍历
    VOID PostOrderTraverse(TreeNode<T>* pNode);//后序遍历
    TreeNode<T>* GetRoot();//返回根节点
    int GetDepth(TreeNode<T>* Node);// 返回当前节点高度
    BOOL IsEmpty();//判断树是否为空
    DWORD Insert(T element);//新增节点
    VOID Delete(T element);//删除节点

private:
    VOID Init();//初始化一些数值
    VOID clear(TreeNode<T>* pNode);//删除所有节点
    DWORD InsertNode(TreeNode<T>* pNode, T element);
    VOID DeleteNode(T element, TreeNode<T>* pNode);
    TreeNode<T>* GetMinNode(TreeNode<T>* pNode);//获取以pNode为根的最小节点,注意传入的是要查询的结点的左子树
    TreeNode<T>* GetMaxNode(TreeNode<T>* pNode);//获取以pNode为根的最大节点,注意传入的是要查询结点的右子树
private:
    TreeNode<T>* pRootNode; //根节点指针
    int size;//树中元素总数
};

template <typename T>
TreeNode<T>* BsortTree<T>::GetMinNode(TreeNode<T>* pNode)//获取以pNode为根的最小节点
{
    if (pNode==nullptr)
    {
        cout << "没有最小的结点!" << endl;
        return 0;
    }
    else if (pNode->pright == nullptr)
    {
        return pNode;
    }
    GetMinNode(pNode->pright);
}

template <typename T>
TreeNode<T>* BsortTree<T>::GetMaxNode(TreeNode<T>* pNode)
{
    if (pNode == nullptr)
    {
        cout << "没有最小的结点!" << endl;
        return 0;
    }
    else if (pNode->pleft == nullptr)
    {
        return pNode;
    }
    GetMaxNode(pNode->pleft);
}

template <typename T>
VOID BsortTree<T>::Delete(T element)//删除节点
{
    if (this->pRootNode == nullptr)
    {
        cout << "没有元素可以删除!" << endl;
    }
    else
    {
        DeleteNode(element, this->GetRoot());
    }
}

template <typename T>
VOID BsortTree<T>::DeleteNode(T element, TreeNode<T>* pNode)
{
    if (pNode->element == element)
    {
        if (pNode->pleft == nullptr && pNode->pright == nullptr)
        {
            TreeNode<T>* temp_ptr = pNode->p_parent;
            temp_ptr->pleft = nullptr;
            delete pNode;
         
        }
        
        else if (pNode->pleft == nullptr && pNode->pright != nullptr)
        {
            TreeNode<T>* temp_ptr = pNode->p_parent;
            temp_ptr->pright = pNode->pright;
            pNode->pright = nullptr;
            delete pNode->pright;
  
        }

        else if (pNode->pleft != nullptr && pNode->pright == nullptr)
        {
            TreeNode<T>* temp_ptr = pNode->p_parent;
            temp_ptr->pleft = pNode->pleft;
            pNode->pleft = nullptr;
            delete pNode->pleft;
        
        }

        else if (pNode->pleft != nullptr && pNode->pright != nullptr)
        {
            TreeNode<T>* temp_ptr = GetMaxNode(pNode->pleft);
            T temp_element = temp_ptr->element;
            pNode->element = temp_element;
            pNode->pleft = nullptr;
            DeleteNode(temp_element, temp_ptr);
        }
    }
    else
    {
        if (element > pNode->element)
        {
            DeleteNode(element, pNode->pright);
        }
        else
        {
            DeleteNode(element, pNode->pleft);
        }
    }
}


template <typename T>
DWORD BsortTree<T>::Insert(T element)//新增节点
{
    if (this->GetRoot() == nullptr)
    {
        this->pRootNode = new TreeNode<T>(element);
    }
    else
        return InsertNode(this->pRootNode,element);
}

template <typename T>
DWORD BsortTree<T>::InsertNode(TreeNode<T>* pNode, T element)
{
    if (pNode->element == element)
    {
        return 0;
    }

    else if (element < pNode->element && pNode->pleft == nullptr)
    {
        pNode->pleft = new TreeNode<T>(element);
        pNode->pleft->p_parent = pNode;
    }

    else if (element > pNode->element && pNode->pright == nullptr)
    {
        pNode->pright = new TreeNode<T>(element);
        pNode->pright->p_parent = pNode;
    }

    else
    {
        if (element < pNode->element)
        {
            InsertNode(pNode->pleft, element);
        }
        
        else
        {
            InsertNode(pNode->pright, element);
        }
    }
}


template <typename T>
BsortTree<T>::BsortTree()
{
    Init();
}

template <typename T>
VOID BsortTree<T>::Init()
{
	
	Monster m1(4, "混世魔王", 50);
	Monster m2(1, "金斯尔", 100);
	Monster m3(2, "游离", 74);
	Monster m4(3, "尔康", 56);
	Monster m5(5, "二讹", 88);
	Monster m6(6, "传奇", 999);
	TreeNode<Monster>* n1 = new TreeNode<Monster>(m1);
	TreeNode<Monster>* n2 = new TreeNode<Monster>(m2);
	TreeNode<Monster>* n3 = new TreeNode<Monster>(m3);
	TreeNode<Monster>* n4 = new TreeNode<Monster>(m4);
	TreeNode<Monster>* n5 = new TreeNode<Monster>(m5);
	TreeNode<Monster>* n6 = new TreeNode<Monster>(m6);

	this->pRootNode = n3;
	n3->pleft = n2;
    n2->p_parent = n3;
	n3->pright = n1;
    n1->p_parent = n3;
	n1->pleft = n4;
    n4->p_parent = n1;
	n1->pright = n5;
    n5->p_parent = n1;
	n5->pright = n6;
    n6->p_parent = n5;
	this->size = 6;
	/*
	   2
  1        4
	    3     5
			     6
	*/   //顺序是 2 3 4 1 5 6   21 32 43 14 55 66
}

template <typename T>
VOID BsortTree<T>::InOrderTraverse(TreeNode<T>* pNode)
{
    if (pNode == nullptr)
    {
        return ;
    }
    if (pNode != nullptr)
    {
        InOrderTraverse(pNode->pleft);
        cout << pNode->element << endl;
        InOrderTraverse(pNode->pright);
    }
}

template <typename T>
VOID BsortTree<T>::PreOrderTraverse(TreeNode<T>* pNode)
{
    if (pNode != nullptr)
    {
        cout << pNode->element << endl;
        PreOrderTraverse(pNode->pleft);
        PreOrderTraverse(pNode->pright);
    }
}

template <typename T>
VOID BsortTree<T>::PostOrderTraverse(TreeNode<T>* pNode)
{
    if (pNode != nullptr)
    {
       
        PostOrderTraverse(pNode->pleft);
        PostOrderTraverse(pNode->pright);
        cout << pNode->element << endl;
    }

}

template<class T>
TreeNode<T>* BsortTree<T>::GetRoot() {
    return pRootNode;
}

template<class T>// 返回当前节点高度,Node
int BsortTree<T>::GetDepth(TreeNode<T>* Node) {
    if (Node == nullptr) {
        return 0;
    }
    else
    {
        int Left = GetDepth(Node->pleft);
        int Right = GetDepth(Node->pright);
        return (Left > Right) ? (Left + 1) : (Right + 1);
    }

}

template <typename T>
BOOL BsortTree<T>::IsEmpty()
{
    if (this->GetRoot() == nullptr)
    {
        return true;
    }
    else
        return false;
}



int main()
{
    BsortTree<Monster> tree;
    //tree.InOrderTraverse(tree.GetRoot());
    //tree.PostOrderTraverse(tree.GetRoot());
    //tree.PreOrderTraverse(tree.GetRoot());
    cout << tree.GetDepth(tree.GetRoot()) << endl;
    Monster m(5, "二讹", 88);
    tree.Insert(m);
  //  tree.InOrderTraverse(tree.GetRoot());
    tree.Delete(m);
    tree.InOrderTraverse(tree.GetRoot());
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值