1. 程式人生 > >使用C++陣列實現二叉樹的儲存和基本操作

使用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;
}


相關推薦

使用C++陣列實現儲存基本操作

1、建立檔案ArrayTree.h 定義二叉樹的資料結構 #ifndef ARRAYTREE_H #define ARRAYTREE_H class ArrayTree{ public: Ar

C語言實現的插入刪除

二叉樹的插入刪除://首先介紹二叉樹的插入:     //首先需要明白插入的規則:每個建好的結點p都需要從跟結點開始與根結點相比較資料域,如果根結點的資料域小於結點p,則接著將結點p與根結點的右子樹相比較,否則p將與根結點的左子樹相比較;     //繼續往下類推,一直到最後

插入刪除操作的遞迴實現c語言)

連結串列和陣列是最常見的資料結構,對於資料結構來說,查詢(Find),最大最小值(FindMin,FindMax),插入(Insert)和刪除(Delete)操作是最基本的操作。對於連結串列和陣列來說,這些操作的時間界為O(N),其中N為元素的個數。陣列的插入和刪除需要對其他

C++類實現的構建遍歷

#include<iostream> #include<fstream> #include<string.h> using namespace std; /*

c語言實現的遍歷建立程式(附帶註釋)

/******************************************************************/ //樹的遞迴思想,把每個節點當作是一棵樹,以後序遍歷為例 //步驟1:訪問左子樹.2訪問右子樹3.列印當前節點的值 //在節點遍歷時如果

c語言實現基本操作--連結串列儲存

利用二叉連結串列儲存,並且利用遞迴的方法實現二叉樹的遍歷(前序遍歷、中序遍歷和後續遍歷)操作。 c語言具體實現程式碼如下: #include<stdio.h> #include<stdlib.h> #include<malloc.h>

資料結構之---C語言實現的順序儲存

//二叉樹的順序儲存 //這裡利用迴圈佇列儲存資料 //楊鑫 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #defi

C語言實現的結構常用操作

#include<stdio.h> #include <stdlib.h> typedef float ElemType; typedef struct S_BiTNode//定義結點型別結構體 { ElemType data;//資料域 str

C語言實現各種基本運算的演算法

 包含如下函式: CreateBTree( BTNode * &b, char * str ) : 由 括號表 示 串 str 創 建二叉鏈b ; FindNode( BTNode * &b,  ElemType x ) : 返回data域 為 x的節

C語言複習資料結構之簡單的輸入輸出操作

C語言複習之簡單的二叉樹的僅輸入輸出操作 1:結構體 typedef struct TreeNode{ _Data value; struct TreeNode * father; struct TreeNode * right; stru

C語言實現中統計葉子結點的個數&度為1&度為2的結點個數

演算法思想 統計二叉樹中葉子結點的個數和度為1、度為2的結點個數,因此可以參照二叉樹三種遍歷演算法(先序、中序、後序)中的任何一種去完成,只需將訪問操作具體變為判斷是否為葉子結點和度為1、度為2的結點及統計操作即可。 #include <stdio.h> #include &

C語言實現的建立&遍歷

演算法思想(重點是遞迴的使用)  利用擴充套件先序遍歷序列建立二叉連結串列 採用類似先序遍歷的遞迴演算法,首先讀入當前根結點的資料,如果是'.'則將當前 樹根置為空,否則申請一個新結點,存入當前根結點的資料,分別用當前根結點的 左子域和右子域進行遞迴呼叫,建立左、右子樹. 

C語言實現基本操作

       我在前面的部落格中講解了連結串列、棧和佇列,這些資料結構其實都是線性表,並且給出了詳細的實現。從今天開始,我們將要來學習樹,樹作為一種資料結構我們經常會用到,作為起步和基礎,我們先來實現二叉樹,也就是每個節點有不超過2個子節點的樹。對於樹的操作,最基本的建立、遍

c語言實現的插入、查詢、刪除、列印

目錄: 二叉樹的關鍵概念: 每個節點是一個自引用結構體,形式如下: struct TreeNode { struct TreeNode *leftPtr; /* pointer to left subtree */

C語言實現的各種遍歷及求解深度

#include<stdio.h> #include<malloc.h> #define MAXSIZE 100 typedef char dataType; //二叉樹結構 typedef struct bnode{ dataType data; struct bnode *lC

c語言實現連結串列)非遞迴後序遍歷

演算法思想 因為後序遍歷是先訪問左子樹,再訪問右子樹,最後訪問根節點。當用棧實現遍歷時,必須分清返回根節點時,是從左子樹返回的還是從右子樹返回的。所以使用輔助指標r指向最近已訪問的結點。當然也可以在節點中增加一個標誌域,記錄是否已被訪問。 #include<iost

C++模板實現(五 的平衡之dsw演算法)

二叉樹的高效查詢演算法依賴於樹的平衡.如果樹高度不平衡,二叉樹將退化成類似連結串列的效率,則二叉樹的優勢就不存在了.平衡二叉樹的dsw演算法提供了一種將二叉樹轉化成平衡二叉樹的方法. 演算法的核心思想是利用旋轉. 1.通過右旋轉生成主鏈. 2.通過左旋轉生

C語言實現基本操作---建立、遍歷、求深度、求葉子結點

#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedefint ElemType;//資料型別 //定義二叉樹結構,與單鏈表相似,多了一個右孩子結點 typed

c語言實現常用演算法

構造二叉樹結點結構 typedef struct BT { char data; struct BT *l_chrild; struct BT *r_chrild; }BT; 建立二叉樹 BT* Create_tree()//

c語言實現的先序遍歷,中序遍歷,後序遍歷

// new.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <MEMORY.H> #include <STRING.H&