c++ 先序構建二叉樹

来源:https://www.cnblogs.com/clc2008/archive/2018/12/27/10187565.html
-Advertisement-
Play Games

二叉樹首先要解決構建問題,才能考慮後續的遍歷,這裡貼出通過先序構建二叉樹,同時包含四種二叉樹的遍歷方法(先序,中序,後序,逐層) 第一、定義BinaryTreeNode 類 1 #include <iostream> 2 #include <string> 3 #include <queue> 4 ...


二叉樹首先要解決構建問題,才能考慮後續的遍歷,這裡貼出通過先序構建二叉樹,同時包含四種二叉樹的遍歷方法(先序,中序,後序,逐層)

第一、定義BinaryTreeNode 類

 1 #include <iostream>
 2 #include <string>
 3 #include <queue>
 4 using namespace std;
 5 
 6 template<typename T >class BinaryTree;
 7 template <typename T> class BinaryTreeNode {
 8 public:
 9     friend class BinaryTree<T>;
10     BinaryTreeNode() {
11         data = NULL;
12         lChild = rChild = NULL;
13     }
14     BinaryTreeNode(T newdata) {
15         this->data = newdata;
16         lChild = rChild = NULL;
17     }
18     T getData() {
19         return data;
20     }
21     BinaryTreeNode<T> * getLeftNode() {
22         return lChild;
23     }
24     BinaryTreeNode<T> * getRightNode() {
25         return rChild;
26     }
27     T data;
28     BinaryTreeNode<T>* lChild;
29     BinaryTreeNode<T>* rChild;
30 private:
31 
32 };
View Code

 

第二、定義BinaryTree 類

  1 template <typename T> class BinaryTree {
  2 public:
  3     BinaryTreeNode<T> *root;
  4     char* p;
  5     BinaryTree() { root = NULL; }
  6     BinaryTree(T data) {
  7         root = new BinaryTreeNode<T>(data);
  8         root->lChild = NULL;
  9         root->rChild = NULL;
 10     }
 11     ~BinaryTree() {
 12         delete root;
 13     }
 14 
 15     //構建二叉樹並返回
 16     BinaryTreeNode<T>* CreateTree() {
 17         BinaryTreeNode<int>* bt = NULL;
 18         char t;
 19         cin >> t;
 20         if (t == '#')
 21         {
 22             return NULL;
 23         }
 24         else {
 25             int num = t - '0';
 26             bt = new BinaryTreeNode<T>(num);
 27             bt->lChild = CreateTree();
 28             bt->rChild = CreateTree();
 29         }
 30         return bt;
 31     }
 32 
 33     //先序構建二叉樹
 34     BinaryTreeNode<T>* PreCreateTree() {
 35         BinaryTreeNode<int>* bt = NULL;
 36         if (this->root == NULL)
 37         {
 38             cout << "請輸入根節點(#代表空樹):";
 39         }
 40         else {
 41             cout << "請輸入節點(#代表空樹):";
 42         }
 43         char t;
 44         cin >> t;
 45         if (t == '#')
 46         {
 47             return NULL;
 48         }
 49         else {
 50             int num = t - '0';
 51             bt = new BinaryTreeNode<T>(num);
 52             if (this->root == NULL)
 53             {
 54                 this->root = bt;
 55             }
 56             cout << bt->data << "的左孩子";
 57             bt->lChild = PreCreateTree();
 58 
 59             cout << bt->data << "的右邊孩子";
 60             bt->rChild = PreCreateTree();
 61         }
 62         return bt;
 63     }   
 64 
 65     void preOderTraversal(BinaryTreeNode<T> *bt);  //先序遍歷
 66     void inOrderTraversal(BinaryTreeNode<T> *bt);  //中序遍歷
 67     void postOrderTraversal(BinaryTreeNode<T> *bt);//後序遍歷
 68     void levelTraversal(BinaryTreeNode<T> *bt);    //逐層遍歷
 69 
 70 private:
 71 
 72 };
 73 
 74 template <typename T>
 75 void BinaryTree<T>::preOderTraversal(BinaryTreeNode<T> *bt) {
 76     if (bt)
 77     {
 78         cout << bt->data;
 79         BinaryTree<T>::preOderTraversal(bt->getLeftNode());
 80         BinaryTree<T>::preOderTraversal(bt->getRightNode());
 81     }
 82 }
 83 
 84 template <typename T>
 85 void BinaryTree<T>::inOrderTraversal(BinaryTreeNode<T> *bt) {
 86     if (bt)
 87     {
 88         BinaryTree<T>::inOrderTraversal(bt->getLeftNode());
 89         cout << bt->data;
 90         BinaryTree<T>::inOrderTraversal(bt->getRightNode());
 91     }
 92 }
 93 
 94 template <typename T>
 95 void BinaryTree<T>::postOrderTraversal(BinaryTreeNode<T> *bt) {
 96     if (bt)
 97     {
 98         BinaryTree<T>::postOrderTraversal(bt->getLeftNode());
 99         BinaryTree<T>::postOrderTraversal(bt->getRightNode());
100         cout << bt->data;
101     }
102 }
103 
104 template <typename T>
105 void BinaryTree<T>::levelTraversal(BinaryTreeNode<T> *bt) {
106 
107     queue<BinaryTreeNode<T>*> que;
108     que.push(bt);
109     while (!que.empty())
110     {
111         BinaryTreeNode<T>* proot = que.front();
112         que.pop();
113         cout << proot->data;
114 
115         if (proot->lChild != NULL)
116         {
117             que.push(proot->lChild);//左孩子入隊
118         }
119         if (proot->rChild != NULL)
120         {
121             que.push(proot->rChild);//右孩子入隊
122         }
123     }
124 }
View Code

 

第三、主程式運行

 1 #include "pch.h"
 2 #include <iostream>
 3 #include "BinaryTree.h"
 4 
 5 int main()
 6 {
 7     //場景測試2
 8     BinaryTree<int> btree;
 9     btree.PreCreateTree();//先序構建二叉樹
10     cout << "先序遍歷:";
11     btree.preOderTraversal(btree.root); cout << endl;//先序遍歷    
12     cout << "中序遍歷:";
13     btree.inOrderTraversal(btree.root); cout << endl;//中序遍歷
14     cout << "後序遍歷:";
15     btree.postOrderTraversal(btree.root); cout << endl;//後序遍歷
16     cout << "逐層序遍歷:";
17     btree.levelTraversal(btree.root);
18 
19 }
View Code

最終測試運行截圖

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼要統一返回值 在我們做後端應用的時候,前後端分離的情況下,我們經常會定義一個數據格式,通常會包含 ,`message data`這三個必不可少的信息來方便我們的交流,下麵我們直接來看代碼 ReturnVO 在這裡,我提供了幾個構造方法以供不同情況下使用。代碼的註釋已經寫得很清楚了,大家也可以應 ...
  • 集合類的由來: JAVA是面向對象的,對象用來封裝特有數據,對象多了就需要儲存起來,當對象的個數不確定的時候,那麼就用集合容器進行存儲。 集合的特點: 1.集合的長度是可變的 2.用於存儲對象的容器 3.不可以存儲基本數據類型 體系: 集合容器因為內部的數據結構不同,有多種具體容器,不斷的向上提取, ...
  • 第一步:自報家門(全局屬性) 第一個是你的名字 第二個是你的郵箱 第二步:創建版本庫 首先確定一個你想要的位置,創建一個文件夾 通過命令移動到該文件夾下麵,使用 git init 命令 第三步, 創建一個文件 readme.txt 使用vi編輯器輸入一點內容 使用git add readme.txt ...
  • 天氣數據可以從網上下載,這個例子的數據是從http://data.cma.cn/下載而來的。 下載的數據裝在txt文件中。 裡面包含了12年開始北京的月最低和最高溫度。 讀取數據: 將txt中的數據逐行存到列表lines里 lines的每一個元素對應於txt中的一行。然後將每個元素中的不同信息提取出 ...
  • Yaml配置文件 概述 在支持 配置文件的同時,也支持 配置文件. 配置文件中的屬性,可以通過: 通過 註解將屬性值註入 中; 通過 註解將屬性值註入 中. 此處不推薦使用 方式註入屬性,原因有二: 對於較為複雜的數據結構難以設置,諸如 ,`Object`; 不支持對屬性值進行校驗,諸如 ,`@Si ...
  • 今天優化了一下三級菜單的代碼 兩個版本: 一:分幾次迴圈完成: ...
  • Models.py#coding:utf8fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)#實例化app.config["SQLALCHEMY_DATABASE_URI"]="mysql://roo... ...
  • 源碼文件的三種類型: 命令源文件:可以直接運行的程式,可以不編譯而使用命令“go run”啟動、執行。 庫源碼文件 測試源碼文件 面試題:命令源碼文件的用途是什麼,怎樣編寫它? 典型回答: 命令源碼文件是程式的運行入口,是每個可獨立運行的程式必須擁有的。 我們可以通過構建或安裝生成與其對應的可執行文 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...