二叉樹數組C++實現


基本概念梳理

  1. 孩子:子結點
  2. 雙親:父節點
  3. 度:有多少個子結點
  4. 有序樹:固定的排列的樹
  5. 無序樹:排列與順序無關的樹
  6. 二叉樹:所有結點小於等於2的樹

源代碼:https://github.com/cjy513203427/C_Program_Base/tree/master/56.%E4%BA%8C%E5%8F%89%E6%A0%91%E6%95%B0%E7%BB%84%E5%AE%9E%E7%8E%B0

需要實現的方法

#pragma once
#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);//添加結點
    bool DeleteNode(int nodeIndex, int *pNode);//刪除結點
    void TreeTraverse();//遍歷
private:
    int *m_pTree;
    int m_iSize;
};

#endif // !TREE_H

1.創建樹

傳入數組容量和根節點地址

m_iSize和m_pTree初始化

將數組都置為0初始化

pRoot指向的內存單元的樹值賦值數組首元素(根元素)

Tree::Tree(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;
}

 2.銷毀樹

刪除指針並置空

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

3.根據索引尋找結點

先判斷索引的合法性,索引不能小於0或者大於等於長度

傳入數組的值不能等於0

返回該數組地址

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

4.添加結點

判斷索引合法性,和3.一樣

direction = 0代表添加左子節點,direction = 1代表添加右子節點

左子節點 = 2*索引+1;右子節點 = 2*索引+2

下圖可以驗證

繼續判斷索引的合法性,左子節點和右子節點同樣不能小於0或者大於等於數組長度

最后將*pNode賦值給子節點

bool Tree::AddNode(int nodeIndex, int direction, int *pNode)
{
    if (nodeIndex<0 || nodeIndex >= m_iSize)
    {
        return false;
    }
    if (m_pTree[nodeIndex] == 0)
    {
        return false;
    }
    if (direction == 0)
    {
        //nodeIndex * 2 + 1<0可以省略
        if (nodeIndex * 2 + 1<0 || nodeIndex * 2 + 1 >= m_iSize)
        {
            return false;
        }
        //判斷是否有左子節點
        if (m_pTree[nodeIndex * 2 + 1] != 0)
        {
            return false;
        }
        m_pTree[nodeIndex * 2 + 1] = *pNode;
    }
    if (direction == 1)
    {
        //nodeIndex * 2 + 2<0可以省略
        if (nodeIndex * 2 + 2<0 || nodeIndex * 2 + 2 >= m_iSize)
        {
            return false;
        }
        //判斷是否有左子節點
        if (m_pTree[nodeIndex * 2 + 2] != 0)
        {
            return false;
        }
        m_pTree[nodeIndex * 2 + 2] = *pNode;
    }
    return true;
}

 5.刪除結點

判斷索引和數組值的合法性

將*pNode接收刪除的對應索引的數組

將該索引數組置為0,結點值等於0代表刪除

返回正確結果

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

6.遍歷

沒啥好說的

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM