1. 程式人生 > >C++資料結構:二叉樹(一)——先序建立二叉樹

C++資料結構:二叉樹(一)——先序建立二叉樹

一、二叉樹 (Binary Tree)

定義: 二叉樹是n個節點的有限集合,該集合或者為空集( 稱為空二叉樹 ),或者由一個根節點和兩棵互不相交的的二叉樹組成,這兩棵二叉樹分別稱為根節點的左子樹和右子樹。

本次二叉樹知識體系的總結秉承的思想是:我們希望 二叉樹類BiTree,它的私有成員能體現二叉樹本身的性質,它的公有成員能提供給使用者一系列對二叉樹的操作方法。

二、先序建立二叉樹

BiTree.h 標頭檔案定義如下:

typedef char Item;          //樹中資料型別
typedef struct node         //每個節點包含一個數據,一個左指標,一個右指標
{ Item data; //節點中資料 struct node *lchild; //指向當前節點的左孩子 struct node *rchild; //指向當前節點的右孩子 }BiTNode; class BiTree { private: BiTNode *root; //二叉樹的根節點 int size; //二叉樹的大小 int depth; //二叉樹的深度 public: BiTree
(); //初始化二叉樹建構函式 void GetBiTRoot(); //獲取根節點 void GetBiTNum(); //獲取二叉樹節點數目 void GetBiTDepth(); //獲取二叉樹的深度 BiTNode* CreateBiTree(); //先序建立二叉樹 };

BiTree.cpp 檔案定義如下:

#include "BiTree.h"
#include <iostream>
#include <queue> using namespace std; static int leftdepth = 0; //左深度計數器 static int rightdepth = 0; //右深度計數器 //函式原型 //建構函式 //初始化二叉樹,根節點指向空,樹大小為0,深度為0 BiTree::BiTree() { root = nullptr; size = 0; depth = 0; } //操作: 獲取二叉樹根節點資料 void BiTree::GetBiTRoot() { cout << "二叉樹的根節點為:"; cout << this->root->data << endl; } //操作: 獲取二叉樹節點數目 void BiTree::GetBiTNum() { cout << "二叉樹的節點數目為:"; cout << this->size << endl; } //操作: 獲取二叉樹的深度 void BiTree::GetBiTDepth() { cout << "二叉樹的深度為:"; cout << this->depth << endl; } //操作: 先序建立二叉樹 //操作前:無引數,輸入#表示為空 //操作後:建立完整的樹並返回樹的根節點 BiTNode* BiTree::CreateBiTree() { BiTNode *ptree; //指向當前樹節點的指標 if (this->root == nullptr) cout << "請輸入根節點(#代表空樹):"; else cout << "請輸入節點(#代表空樹):"; Item TreeData; //樹中的資料 cin >> TreeData; //輸入資料 if (TreeData == '#') //如果輸入的是“#”則表示空 ptree = nullptr; else //否則不為空,申請一個空 { if (!(ptree = new BiTNode)) exit(1); ptree->data = TreeData; if(this->root == nullptr) this->root = ptree; this->size++; //節點個數+1 cout << ptree->data << "的左孩子"; if(ptree->lchild = CreateBiTree()) leftdepth++; //左深度+1 cout << ptree->data << "的右孩子"; if(ptree->rchild = CreateBiTree()) rightdepth++; //右深度+1 } this->depth = (leftdepth > rightdepth ? leftdepth : rightdepth) + 1; return ptree; //最終返回樹的根節點 }

UseBiTree.cpp 檔案定義如下:

#include "BiTree.h"
#include <iostream>
using namespace std;
int main()
{
    BiTree tree;
    tree.CreateBiTree();    //先序建立二叉樹
    tree.GetBiTRoot();      //獲取二叉樹的根節點資料
    tree.GetBiTNum();       //獲取二叉樹的總節點個數
    tree.GetBiTDepth();     //獲取二叉樹的深度

    system("pause");
    return EXIT_SUCCESS;
}

三、執行結果

輸入二叉樹如下圖所示

二叉樹
執行結果

執行結果


如有不對的地方歡迎大家指正交流

相關推薦

C++資料結構——建立

一、二叉樹 (Binary Tree) 定義: 二叉樹是n個節點的有限集合,該集合或者為空集( 稱為空二叉樹 ),或者由一個根節點和兩棵互不相交的的二叉樹組成,這兩棵二叉樹分別稱為根節點的左子樹和右

C#資料結構與算法系列逆波蘭計算器——逆波蘭表示式字尾表示式

1.介紹 字尾表示式又稱逆波蘭表示式,與字首表示式相似,只是運算子位於運算元之後 2.舉例說明 (3+4)*5-6對應的字尾表示式就是3 4 +5 * 6 - 3.示例 輸入一個逆波蘭表示式(字尾表示式),使用棧(Stack),計算其結果 思路分析: 從左至右掃描表示式,遇到數字時,將數字壓入堆疊,遇到運算

極客講堂之資料結構與演算法之美複雜度分析

(本文根據極客講堂——資料結構與演算法之美專欄的問答區整理修改而成,如有侵權還希望聯絡我鴨~) 一、什麼是複雜度分析? 1.資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。 2.因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 3.分別

資料結構之程式效能檢測三種排序演算法·對比

先上程式碼: #include<stdio.h> #include<time.h> # define MAX_SIZE 1001 void sort(int *a, int n); void sort2(int *a, int n)

資料結構與演算法——單鏈表

單鏈表的頭插法,插入時就是逆序。 InsertList()還不完善。 #include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 typedef int Status ; typedef int

資料結構與演算法——線性表

#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 200 #define LISTINCREASE 10 #define ERROR 0 #define OK 1 typedef int Elemt

資料結構-高精度大整數

每當我在C、C++語言中用到大整數的時候,都會羨慕Java的自帶大整數類的屬性。無奈只好自己動手,豐衣足食了。 從網上學習了大整數類的實現方法,覺得寫的挺好的,時間久了不記得從哪位大神的部落格裡學習的了...在這裡記錄一下自己的學習過程吧。 高精度大整數類:本類實現了大數

資料結構與演算法學習總結

1.什麼是資料結構和演算法 資料結構,就是一組資料的儲存結構。演算法,就是操作資料的一組方法。資料結構是為演算法服務的,演算法要作用在特定的資料結構之上。 2.為什麼要學習資料結構和演算法? (1)對個人:資料結構和演算法是程式設計師的必修課程之一,能幫助我們寫出效能更

linux核心分析--核心中的資料結構之雙鏈表

關於核心中使用到的資料結構這一系列會有五篇文章, 分別介紹    連結串列    佇列    雜湊    對映    紅黑樹

資料結構與演算法之美

想要學習資料結構與演算法,首先要掌握複雜度分析。因為資料結構與演算法要解決的就是如何更省,更快的儲存和處理資料的問題,因此我們要有一個衡量效率和資源消耗的方法,這就是複雜度的分析 作為初學者和非演算法工程師,只需要掌握最常用、最基礎的20個數據結構與演算法,學習他們的:“來歷”、“特點”、“適合解決什麼問題

《大話資料結構》讀後總結

開發十年,就只剩下這套架構體系了! >>>   

1.資料結構學習之線性表

開篇:資料結構是程式應用裡基礎的學科。 官方來說,資料結構是計算機儲存、組織資料的方式。 資料結構有著非常重要的重用,如果理解並且掌握它,在我們的學習或者工作中的開發會事半功倍。 接下來,開始我們的資料結構學習之路吧。(程式碼為C#形式)   1.什麼是線性表? 線性表是最基本、

資料結構與算法系列陣列實現

## 資料結構與算法系列(一)陣列實現 注:`這是一個新的系列,主要是由於資料結構與演算法是程式設計師以後立身的根本,我以前在大學也學過,但是很快就忘記了,現在想把它撿起來,通過寫一個系列文章,加深自己的理解,其實我寫這個系列主要是想先通過預熱,然後去刷leetcode。刷演算法本身是想鍛鍊自己寫程式的思維,

C++資料結構——的遍歷

一、序言 在上一篇文章中《二叉樹的先序建立》,我們介紹了二叉樹的基本結構以及先序建立二叉樹,在本篇文章中,我們要對二叉樹進行遍歷,包括: 層序遍歷 遞迴先序遍歷、遞迴中序遍歷、遞迴後序遍歷 非遞迴中序遍歷 二、二叉樹的遍歷 BiTree.h

《 常見演算法與資料結構》符號表ST4——查詢刪除 附動畫

符號表ST(4)——二叉查詢樹刪除 (附動畫) 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為

PTA資料結構與演算法題目集中文4-12 搜尋的操作集 (30分)

本題要求實現給定二叉搜尋樹的5種常用操作。 函式介面定義: BinTree Insert( BinTree BST, ElementType X ); BinTree Delete( BinTree BST, ElementType X ); Position Fin

PTA 資料結構與演算法題目集中文 6-9 的遍歷

6-9 二叉樹的遍歷(25 分)本題要求給定二叉樹的4種遍歷。函式介面定義:void InorderTraversal( BinTree BT ); void PreorderTraversal( Bi

PTA資料結構與演算法題目集中文4-9 的遍歷 (25分)

本題要求給定二叉樹的4種遍歷。 函式介面定義: void InorderTraversal( BinTree BT ); void PreorderTraversal( BinTree BT ); void PostorderTraversal( BinTree BT

數據結構

reorder system style 序列 urn creat 編寫程序 space ont 設計和編寫程序,按照輸入的遍歷要求(即先序、中序和後序)完成對二叉樹的遍歷,並輸出相應遍歷條件下的樹結點序列。 1 //遞歸實現 2 #include

數據結構 - 從搜索說到AVL搜索的操作與詳解Java

判斷 right 不為 exist avl 輸入 位置 bubuko get   二叉搜索樹(Binary Search Tree),簡稱BST,顧名思義,一顆可以用於搜索的二叉樹。BST在數據結構中占有很重要的地位,一些高級樹結構都是其的變種,例如AVL樹、紅黑樹等,因此