1. 程式人生 > >二叉樹順序結構儲存

二叉樹順序結構儲存


實現如下二叉樹:




程式碼:


[cpp] view plain copy
#include<iostream>  
#include<cstring>  
using namespace std;  
const int maxsize=100;  
class bitree  
{  
public:  
    bitree();  
    ~bitree(){}  
    int create_bt();  
    void leverorder();  
    void print();  
    void printleaf();  
    int tree[maxsize];  
    int count;  
    int num;  
};  
  
bitree::bitree()  
{  
    for(int i=0;i<maxsize;i++)  
        tree[i]=-1;  
    count=0;  
}  
int bitree::create_bt()  
{  
    int n,i=1;  
    num=0;  
    count=0;  
    cout<<"請按照從上到下、從左到右的順序依次輸入二叉樹各個結點,結節點用0表示,以-1表示輸入結束:"<<endl;  
    while(cin>>n&&n!=-1&&i<maxsize)  
    {  
        tree[i]=n;  
        i++;  
        num++;  
        if(n==0) continue;  
        else count++;  
    }  
    return 0;  
}  
void bitree::leverorder()  
{  
    if(tree[1]==-1) throw"該樹為空樹";  
    for(int i=1;tree[i]!=-1&&i<100;i++)  
        cout<<tree[i]<<" ";  
    cout<<"二叉樹的層序遍歷:";  
    for(i=1;tree[i]!=-1&&i<maxsize;i++)  
    {  
        if(tree[i]==0) continue;  
        cout<<tree[i]<<" ";  
    }  
}  
void bitree::print()  
{  
    for(int i=1;tree[i]!=-1&&i<maxsize;i++)  
    {  
        static int j=0;  
        if(tree[i]==0) continue;  
        else j++;  
        cout<<"第"<<j<<"個結點資訊為"<<tree[i]<<"   ";  
        if(tree[2*i]==0||tree[2*i]==-1) cout<<"該結點無左孩子"<<"    ";  
        else cout<<"左孩子為 "<<tree[2*i]<<"   ";  
        if(tree[2*i+1]==0||tree[2*i+1]==-1) cout<<"該結點無右孩子"<<"    ";  
        else cout<<"右孩子為 "<<tree[2*i+1]<<"   ";  
        if(int(i/2)==0) cout<<"該結點為根結點,無雙親"<<endl;  
        else if(tree[int(i/2)]==0) cout<<"該結點的雙親為 "<<tree[int(i/2)+1]<<endl;  
        else cout<<"該結點的雙親為 "<<tree[int(i/2)]<<endl;  
    }  
}  
void bitree::printleaf()  
{  
    cout<<"所有的葉子結點資訊為 ";  
    for(int i=1;i<num+1;i++)  
    {  
        if((tree[2*i]==0||tree[2*i]==-1)&&(tree[2*i+1]==0||tree[2*i+1]==-1))  
            if(tree[i]!=0&&tree[i]!=-1)  
                cout<<tree[i]<<"   ";  
    }  
}  
  

void main()  
{  
    bitree b;  
    b.create_bt();  
    cout<<"輸入的樹為";  
    try  
    {  
        b.leverorder();  
        cout<<endl;  
    }  
    catch(char *s)  
    {  
        cout<<s<<endl;  
    }  
    cout<<"共有"<<b.count<<"個有效結點"<<endl;  
    b.print();  
    b.printleaf();  
}  

相關推薦

順序結構儲存

實現如下二叉樹:程式碼:[cpp] view plain copy#include<iostream>  #include<cstring>  using namespace std;  const int maxsize=100;  class bi

順序結構實現的C語言

init 存儲 狀態 sta 分配 left 需要 bre oot #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define

順序結構

試驗內容:自己確定一個二叉樹(樹結點型別、數目和結構自定)利用順序結構方法儲存。實現樹的構造,並完成: 1) 層序輸出結點資料; 2) 以合理的格式,輸出各個結點和雙親、孩子結點資訊; 3) 輸出所有的葉子結點資訊; 4)分析你的演算法對於給定的二叉樹的儲存效率。 #in

算術表示式轉換為以結構儲存

算術表示式轉換為以二叉樹的結構儲存 #include <iostream> #include <malloc.h> using namespace std; typedef struct BiTNode { char data; BiTNode

--順序結構

#include "stdio.h" #include "stdlib.h" #include "math.h" #define MAXSIZE 100 #define MAX_TREE_SIZE 100 typedef int Status; typedef i

java由先根中根遍歷序列建立,由標明空子建立,有完全順序儲存結構建立鏈式儲存結構

    //由先根和中根遍歷建立二叉樹 public class bitree{     public bitree(String preorder,String inorder,int preindex,int in

-連結串列儲存結構及其簡單演算法

適用於層次結構的資料(大部分演算法用遞迴思想) #include <stdio.h> #define Max 100 結構體 typedef struct TNode{ int data; struct Node * lchild;//左孩子結點

順序儲存的實現

在實現二叉樹的順序儲存的過程中,遇到了一些問題,現記錄如下: #include<stdio.h> #include<stdlib.h> #include<math.h> #define OK 1 #define ERRO

嚴蔚敏 資料結構 鏈式儲存結構 遍歷等操作

課本 《資料結構(C語言版)(第2版)》 嚴蔚敏版 樹結構的學習。 編譯環境:DEV C++ 檔案格式為 cpp(c++檔案型別),前者的引用函式,在 C 的情況下沒完成。 實現: 二叉樹的先序遍歷

順序儲存實現遍歷

一、對於完全二叉樹可以將其資料元素逐層存放到一組連續的儲存單元中,用一維陣列作為儲存結構,對於編號為i的結點,其左孩子為2i,右孩子為2i+1. 二、實現程式碼及驗證主函式 演算法思想:遍歷演算法的核心任然是遍歷,所想得到的結果是一個輸出序列,將該輸出序列置

18.11.02 由中根序列和後根序列重建-資料結構習題

題目內容: 我們知道如何按照三種深度優先次序來周遊一棵二叉樹,來得到中根序列、前根序列和後根序列。反過來,如果給定二叉樹的中根序列和後根序列,或者給定中根序列和前根序列,可以重建一二叉樹。本題輸入一棵二叉樹的中根序列和後根序列,要求在記憶體中重建二叉樹,最後輸出這棵二叉樹的前根序列。 用不同的整

----資料結構:的三種遍歷,利用遞迴演算法。

二叉樹----資料結構:二叉樹的三種遍歷,利用遞迴演算法。     魯迅:總之歲月漫長,然而值得等待。   #define CHAR /* 字元型 */  /* #define INT /* 整型(二者選一) */  #

資料結構實現

#include<iostream> #include<string.h> #include<vector> #include <queue> using namespace std; struct BiNode { int val; BiN

結構體表示【摘抄自嚴長生老師的網站】

採用鏈式儲存 typedef struct BiTNode{ TElemType data;//資料域 struct BiTNode *lchild,*rchild;//左右孩子指標 }BiTNode,*BiTree; 若需訪問父節點,可如下表示 typedef str

真題2006 完全順序陣列轉化為

題目:一棵具有 n 個結點的完全二叉樹以順序方式儲存在陣列 A 中。設計一個演算法構造該二叉樹的二叉鏈儲存結構。 解:對於以順序方式儲存在陣列 A(其大小為 MaxSize,下標從0開始)中的一棵完全二叉樹,結點 A[i]的左孩子為 A[2i+1],右孩子為 A

面試題_BFs(廣度優先演算法,或者順序輸出)

最近參與面試常常問道關於演算法方面的題1.:按照圖例實現演算法; 分析題得到:明顯是廣度優先演算法(BFS演算法),利用佇列的方式【進佇列– 取值– 出佇列(判斷有無子節點)–所有直接子節點進佇列】 建立節點類 /** * 建立樹類 * @au

堆排序演算法基於資料結構的python實現

堆排序的原理略,此處只是作為記錄,提供整個程式碼的實現,其中每個細節會給出註釋和函式的設計思路(程式碼末尾)。 注:堆排序演算法的實現,以陣列結構來實現要簡潔高效!此處只是作為練手使用,由於堆排序的陣列實現已經有很多, 此處略。 自定義模組: 這個模組我們只用到其節點物件的建立、根據陣列生成

分別根據前中序遍歷和後中序遍歷來推結構

1、理論分析: 資料結構的基礎知識中重要的一點就是能否根據兩種不同遍歷序列的組合(有三種:先序+中序,先序+後序,中序+後序),唯一的確定一棵二叉樹。然後就是根據二叉樹的不同遍歷序列(先序、中序、後序

鏈式儲存及相關操作

      先序建立二叉樹、後序遞迴遍歷二叉樹、中序非遞迴遍歷二叉樹、層次遍歷二叉樹、非遞迴演算法求二叉樹深度、遞迴演算法求二叉樹深度、求分支結點個數、判斷是否為完全二叉樹、先序遍歷第k個結點的值、刪除值為k的結點及其子樹。 #include "stdio.h" #incl

的陣列儲存及運算

二叉樹的陣列儲存 當用陣列儲存完全二叉樹時可以用節點的編號作為陣列下標 當用陣列儲存非完全二叉樹時也可以用節點的編號作為陣列下標,但是要補全節點序列.(用虛擬節點) 2017/8/30 更新 父子節點的位置運算: 陣列0下標不使用 父節點i的左子