树--二叉树的数组实现

来源:互联网 发布:mac dare you 不好看 编辑:程序博客网 时间:2024/06/05 10:29
树--二叉树的数组实现

简要介绍:
树是节点的有限集合
度:当前结点的子节点的数量
叶子:(终端节点)
根:(非终端节点)
有序数:子节点不能互换顺序
无序数:子节点能互换顺序

深度:节点深度和树的深度
节点深度:第一层深度为1,第二层深度为2,第三层深度为3...
数的深度:当前树的节点所具有的最大深度

森林:多颗独立的树,一棵树看成由不同的子树,也是森林

二叉树:所有节点的度 <= 2;

二叉树的遍历:前序遍历、中序遍历、后序遍历
前序遍历:先访问根,后访问左右节点
中序遍历:先访问左节点,然后访问根,最后访问右节点
后序遍历:先访问左右节点,后访问根


二叉树的数组表示:
//-----------------------------------------------
Tree.h
#ifndef TREE_H#define TREE_H//-----------------------------------//-----二叉树的数组表示--------------class Tree{    public:    Tree(int size, int *pRoot);//大小,根节点    ~Tree();    int *searchNode(int nodeIndex);//按照索引找节点    bool addNode(int nodeIndex, int direction, int *pNode);//增加节点,direction为0是左节点,为1是右节点    bool deleteNode(int nodeIndex, int *pNode);//根据索引删除节点,并拿出来给*pNode    void treeTraverse();//遍历    private:    int *m_pTree;//节点指针    int m_iSize;//大小};#endif


Tree.cpp
#include"Tree.h"#include<iostream>using namespace std;Tree::Tree(int size, int *pRoot){        m_iSize = size;    m_pTree = new int[m_iSize];    m_pTree[0] = *pRoot;    for(int i = 1; i < size; i++){        m_pTree[i] = 0;    }}Tree::~Tree(){        delete []m_pTree;    m_pTree = NULL;}int *Tree::searchNode(int nodeIndex){        if(nodeIndex < 0 || nodeIndex >= m_iSize){        return NULL;    }        if(0 == m_pTree[nodeIndex]){        return NULL;    }    return &m_pTree[nodeIndex];}bool Tree::addNode(int nodeIndex, int direction, int *pNode){        if(nodeIndex < 0 || nodeIndex >= m_iSize){        return false;    }        if(0 == m_pTree[nodeIndex]){        return false;    }    //--------------------------------------    if(0 == direction){//左节点                if(nodeIndex*2 + 1 >= m_iSize){            return false;        }                if(0 != m_pTree[nodeIndex*2 + 1]){//说明里面已经有元素了            return false;        }        m_pTree[nodeIndex*2 + 1] = *pNode;        return true; }    //---------------------------------------    if(1 == direction){//右节点                if(nodeIndex*2 + 2 >= m_iSize){            return false;        }                if(0 != m_pTree[nodeIndex*2 + 2]){            return false;        }        m_pTree[nodeIndex*2 + 2] = *pNode;        return true; }    return false;    }bool Tree::deleteNode(int nodeIndex, int *pNode){        if(nodeIndex < 0 || nodeIndex >= m_iSize){        return false;    }        if(0 == m_pTree[nodeIndex]){        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] << " ";    }    cout << endl;}

demo.cpp
#include"Tree.h"#include<iostream>using namespace std;//-------------------int main(){        int root = 1;    Tree *p = new Tree(7, &root);        int node[] = {2, 3, 5, 7, 8};        p->addNode(0, 0, &node[0]);//根的左节点    p->addNode(0, 1, &node[1]);//根的右节点        p->addNode(2, 0, &node[2]);//根的右节点的左节点    p->addNode(2, 1, &node[3]);    //根的右节点的右节点        p->treeTraverse();        cout << "\n根的右节点的右节点:" << *(p->searchNode(6)) << endl;        int t = 0;    p->deleteNode(6, &t);    cout << "\n删除的节点:" << t << endl;    cout << "\n再次遍历:" << endl;    p->treeTraverse();        delete p;//一不小心写成delete []p;就错了,调试半天,哎~    p = NULL;        system("pause");    return 0;} 

//控制台运行得:
1 2 3 0 0 5 7

根的右节点的右节点:7

删除的节点:7

再次遍历:
1 2 3 0 0 5 0
//-------------------------------------------------------------------
//------------------------------------------------------------------
   
0 0
原创粉丝点击