树--二叉树的数组实现

树--二叉树的数组实现

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

深度:节点深度和树的深度
节点深度:第一层深度为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
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值