使用C++陣列實現二叉樹的儲存和基本操作
1、建立檔案ArrayTree.h 定義二叉樹的資料結構
2、建立檔案ArrayTree.cpp 實現二叉樹的定義#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
3、建立main.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; }
#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&