重建二叉樹

来源:http://www.cnblogs.com/sankexin/archive/2016/06/23/5612255.html
-Advertisement-
Play Games

題目 輸入某二叉樹的前序遍歷和中序遍歷,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含有重覆的數字。 例如,前序遍歷序列:{1,2,3,7,3,5,6,8},中序遍歷序列:{4,7,2,1,5,3,8,6} 答案 前序遍歷: 前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷 ...


題目

  輸入某二叉樹的前序遍歷和中序遍歷,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含有重覆的數字。

  例如,前序遍歷序列:{1,2,3,7,3,5,6,8},中序遍歷序列:{4,7,2,1,5,3,8,6}

答案

  前序遍歷:

    前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。

  中序遍歷:

    中序遍歷首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。在遍歷左、右子樹時,仍然先遍歷左子樹,再訪問根結點,最後遍歷右子樹。

 

  1 #include "stdafx.h"
  2 #include<deque>
  3 #include<iostream>
  4 #define TREElEN 6
  5 
  6 struct BinaryTreeNode
  7 {
  8     int                   m_nValue;
  9     BinaryTreeNode*       m_pLeft;
 10     BinaryTreeNode*       m_pRight;
 11 };
 12 
 13 void PrintTreeNode(BinaryTreeNode* pNode)
 14 {
 15     if(pNode != NULL)
 16     {
 17         printf("value of this node is: %c\n", pNode->m_nValue);
 18 
 19         if(pNode->m_pLeft != NULL)
 20             printf("value of its left child is: %c.\n", pNode->m_pLeft->m_nValue);
 21         else
 22             printf("left child is null.\n");
 23 
 24         if(pNode->m_pRight != NULL)
 25             printf("value of its right child is: %c\n", pNode->m_pRight->m_nValue);
 26         else
 27             printf("right child is null\n");
 28     }
 29     printf("\n");
 30 }
 31 
 32 void PrintTree(BinaryTreeNode* pRoot)
 33 {
 34     PrintTreeNode(pRoot);
 35 
 36     if(pRoot != NULL)
 37     {
 38         if(pRoot->m_pLeft != NULL)
 39             PrintTree(pRoot->m_pLeft);
 40 
 41         if(pRoot->m_pRight != NULL)
 42             PrintTree(pRoot->m_pRight);
 43     }
 44 }
 45 
 46 BinaryTreeNode* rebuild(char *preOrder, char* inOrder, int length)
 47 {
 48     if(preOrder == NULL || inOrder == NULL || length <= 0)
 49         return NULL;
 50 
 51     char c = preOrder[0];
 52 
 53     BinaryTreeNode* root = new BinaryTreeNode();
 54     root->m_nValue = c;
 55     root->m_pRight = root->m_pLeft = NULL;
 56 
 57     int i ;
 58     for(i = 0 ; i < length && inOrder[i] != c ; i++);
 59     int leftLength = i;
 60     int rightLength = length - i - 1;
 61 
 62     if(leftLength > 0)
 63             root->m_pLeft = rebuild(&preOrder[1],&inOrder[0],leftLength);
 64 
 65     if(rightLength>0)
 66             root->m_pRight = rebuild(&preOrder[leftLength + 1], &inOrder[leftLength+1], rightLength);
 67     return root;
 68 }
 69 
 70 void PrintFromTopToBottom(BinaryTreeNode* pRoot)
 71 {
 72     if(pRoot == NULL)
 73         return;
 74 
 75     std::deque<BinaryTreeNode *> dequeTreeNode;
 76 
 77     dequeTreeNode.push_back(pRoot);
 78 
 79     while(dequeTreeNode.size())
 80     {
 81         BinaryTreeNode *pNode = dequeTreeNode.front();
 82         dequeTreeNode.pop_front();
 83 
 84         printf("%c ", pNode->m_nValue);
 85 
 86         if(pNode->m_pLeft)
 87             dequeTreeNode.push_back(pNode->m_pLeft);
 88 
 89         if(pNode->m_pRight)
 90             dequeTreeNode.push_back(pNode->m_pRight);
 91     }
 92 }
 93 // 普通二叉樹
 94 //              a
 95 //           /     \
 96 //          b       c  
 97 //         /       / \
 98 //        d       e   f
 99 int main()
100 {
101     char PreOrder[TREElEN] = {'a', 'b', 'd', 'c', 'e', 'f'};
102     char InOrder[TREElEN] =  {'d', 'b', 'a', 'e', 'c', 'f'};
103     BinaryTreeNode* result = rebuild(PreOrder, InOrder, 6);
104     PrintFromTopToBottom(result);
105     printf("\n\n");
106     PrintTree(result);
107 }

  


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

-Advertisement-
Play Games
更多相關文章
  • C++11支持range-based for迴圈。這是一個很方便的特性,能省挺多代碼。以下代碼就能很方便的遍歷vector中的元素,並列印出來: 1 2 3 4 5 6 7 8 std::vector<int> int_vec; int_vec.push_back(1); int_vec.push_ ...
  • 說到java中的重載和覆蓋呢,大家都很熟悉了吧,但是呢我今天就要寫這個。 本文主題: 一.什麼是重載 二.什麼是覆蓋 三.兩者之間的區別 重載(overload): 在一個類中,如果出現了兩個或者兩個以上的同名函數,只要它們的參數的個數,或者參數的類型不同,即可稱之為該函數重載了。 即當函數同名時, ...
  • 本文將介紹常用的線程間通信工具CountDownLatch、CyclicBarrier和Phaser的用法,並結合實例介紹它們各自的適用場景及相同點和不同點。 ...
  • 解題思路: 插入操作在stack1中進行,刪除操作在stack2中進行,如果stack2為空,則將stack1中的所有元素轉移到stack2中。 ...
  • 字元串APPAPT中包含了兩個單詞“PAT”,其中第一個PAT是第2位(P),第4位(A),第6位(T);第二個PAT是第3位(P),第4位(A),第6位(T)。 現給定字元串,問一共可以形成多少個PAT? 輸入格式: 輸入只有一行,包含一個字元串,長度不超過105,只包含P、A、T三種字母。 輸出 ...
  • Any 前面已經有兩次提到過:在scala中,Any類是所有類的超類。 Any有兩個子類:AnyVal和AnyRef。對應Java直接類型的scala封裝類,如Int、Double等,AnyVal是它們的基類;對應引用類型,AnyRef是它們的基類。 scala中,所有類的關係可以用下麵這張圖大致描... ...
  • 昨天通過幾個小程式以及Hangout源碼學習了CLI的基本使用,今天就來嘗試翻譯一下CLI的官方使用手冊。 下麵將會通過幾個部分簡單的介紹CLI在應用中的使用場景。 昨天已經聯繫過幾個基本的命令行參數使用場景, "可以參考這裡" 通過使用Apache Commons CLI可以幫助開發者快速構建命令 ...
  • 本文以序列長度20的{ 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};以及頁面4;為例; 結果: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...