C++实现二叉树数组

C++实现二叉树数组

Tree.h

#ifndef TREE_H
#define TREE_H

#include <iostream>
using namespace std;

class Tree
{
public:
    Tree(int size, int *pRoot);                         //创建树
    ~Tree();                               //销毁树
    int SearchNode(int nodeIndex);          //根据索引寻找节点
    bool AddNode(int nodeIndex, int direction, int *pNode);         //添加节点
    bool DeleteNode(int nodeIndex, int *pNode);         //删除节点
    void treeTraverse();                    //遍历节点

private:
    int *m_pTree;
    int m_iSize;
};

Tree::Tree(int size, int *pRoot)
{
    m_pTree = new int[size];
    m_iSize = size;
    for (int i = 0; i < size; ++i)
    {
        m_pTree[i] = 0;
    }
    m_pTree[0] = *pRoot;
}

Tree::~Tree()
{
    delete[]m_pTree;
    m_pTree = NULL;
}

int Tree::SearchNode(int nodeIndex)
{
    if (nodeIndex < 0 || nodeIndex >= m_iSize && m_pTree[nodeIndex == 0])
    {
        return NULL;
    }

    return m_pTree[nodeIndex];
}

bool Tree::AddNode(int nodeIndex, int direction, int *pNode)
{
    if (nodeIndex < 0 || nodeIndex >= m_iSize && m_pTree[nodeIndex == 0])
    {
        return false;
    }
    if (direction == 0)
    {
        if (nodeIndex * 2 + 1 >= m_iSize && m_pTree[nodeIndex * 2 + 1] != 0)
        {
            return false;
        }
        m_pTree[nodeIndex * 2 + 1] = *pNode;
        return true;
    }
    if (direction == 1)
    {
        if (nodeIndex * 2 + 2 >= m_iSize || m_pTree[nodeIndex * 2 + 2] != 0)
        {
            return false;
        }
        m_pTree[nodeIndex * 2 + 2] = *pNode;
        return true;
    }
}

bool Tree::DeleteNode(int nodeIndex, int *pNode)
{
    if (nodeIndex < 0 || nodeIndex >= m_iSize && m_pTree[nodeIndex == 0])
    {
        return false;
    }
    *pNode = m_pTree[nodeIndex];
    m_pTree[nodeIndex] = 0;
    return true;
}

void Tree::treeTraverse()
{
    for (int i = 0; i < m_iSize; ++i)
    {
        cout << m_pTree[i] << " ";
    }
}

#endif

main.cpp

#include "Tree.h"

int main()
{
    int root = 3;
    Tree *pTree = new Tree(10, &root);
    int e1, e2, e3, e4, e5, e6, e7;
    e1 = 5;
    e2 = 8;
    e3 = 9;
    e4 = 11;
    e5 = 18;
    e6 = 21;
    e7 = 33;

    pTree->AddNode(0, 0, &e1);
    pTree->AddNode(0, 1, &e2);

    pTree->AddNode(1, 0, &e3);
    pTree->AddNode(1, 1, &e4);

    pTree->AddNode(2, 0, &e5);
    pTree->AddNode(2, 1, &e6);

    pTree->DeleteNode(6, &e7);

    pTree->treeTraverse();

    int p = pTree->SearchNode(2);
    cout <<" $ "<< p << " " << e7 << endl;

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值