使用C++数组实现二叉树的存储和基本操作

1、创建文件ArrayTree.h 定义二叉树的数据结构

#ifndef ARRAYTREE_H
#define ARRAYTREE_H
class ArrayTree{
public:
    ArrayTree(int size,int *pRoot);
    ~ArrayTree();
    int *searchNode(int nodeIndex);
    bool addNode(int nodeIndex,int direction,int *node);
    bool delNode(int nodeIndex,int *node);
    void treeTraverse();
private:
    int *m_pTree;
    int m_iSize;
};
#endif // ARRAYTREE_H


2、创建文件ArrayTree.cpp 实现二叉树的定义
#include "ArrayTree.h"
#include <iostream>
using namespace std;
ArrayTree::ArrayTree(int size,int *pRoot){
    m_iSize = size;
    m_pTree = new int[m_iSize];
    for(int i = 0 ;i < m_iSize;i++)
        m_pTree[i] = 0;
    m_pTree[0] = *pRoot;
}
ArrayTree::~ArrayTree(){
    delete[] m_pTree;
    m_pTree = NULL;
}
int* ArrayTree::searchNode(int nodeIndex){
    if(nodeIndex < 0 || nodeIndex >= m_iSize)
        return NULL;
    if(m_pTree[nodeIndex] == 0)
        return NULL;
    return &m_pTree[nodeIndex];
}
/**
direction=1 表示将节点node添加到nodeIndex节点的左子树
direction=2 表示将节点node添加到nodeIndex节点的右子树
**/
bool ArrayTree::addNode(int nodeIndex,int direction,int *node){
    if(nodeIndex < 0 || nodeIndex >= m_iSize)
        return false;
    int index = nodeIndex*2 + direction;
    if(index >= m_iSize)
        return false;
    m_pTree[index] = *node;
    return true;
}
/**
删除一个节点的时候要将他的子树也删除掉,但是此处并没有考虑
**/
bool ArrayTree::delNode(int nodeIndex,int *node){
    if(nodeIndex < 0 || nodeIndex >= m_iSize)
        return false;
    if(m_pTree[nodeIndex] == 0)
        return false;
    *node = m_pTree[nodeIndex];
    m_pTree[nodeIndex] = 0;
    return true;
}
void ArrayTree::treeTraverse(){
    for(int i = 0;i < m_iSize;i++){
        cout<<m_pTree[i]<<",";
    }
    cout<<endl;
}
3、创建main.cpp 测试实现的数据结构

#include <iostream>
#include "ArrayTree.h"
using namespace std;
/**
二叉树的定义(数组表示)
bool createTree(Tree* pTree,Node *pRoot);   //创建树
void destoryTree(Tree *pTree);            //销毁树
Node* SearchNode(Tree *pTree,int nodeIndex);//根据节点索引寻找二叉树
bool addNode(Tree *pTree,int nodeInedx,int drirecton,Node *pNode);//添加节点
void deleteNode(Tree *pTree,int nodeIndex,Node *pNode);//删除节点
void treeTraverse(Tree *pTree);           //遍历
int tree[n] 3 5 8 2 6 9 7
                3[0]                //左孩子的下标=父节点的下标*2 + 1
                                    //右孩子的下标=父节点的下标*2 + 2
        5[1]            8[2]
     2[3]   6[4]     9[5]   7[6]

**/
/**节点的度就是节点的分支的个数**/
int main()
{
    int root = 3;
    ArrayTree *pTree = new ArrayTree(10,&root);
    int n1 = 5;
    int n2 = 8;
    pTree->addNode(0,1,&n1);
    pTree->addNode(0,2,&n2);

    int n3 = 2;
    int n4 = 6;
    pTree->addNode(1,1,&n3);
    pTree->addNode(1,2,&n4);

    int n5 = 9;
    int n6 = 7;
    pTree->addNode(2,1,&n5);
    pTree->addNode(2,2,&n6);

    pTree->treeTraverse();

    int temp;
    pTree->delNode(6,&temp);
    cout<<"temp:"<<temp<<endl;
    pTree->treeTraverse();
    int *node = pTree->searchNode(2);
    cout<<"node:"<<*node<<endl;
    delete pTree;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值