1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      用一棵二叉樹的前序遍歷結果和中序遍歷結果還原這棵二叉樹——6-創(chuàng)新互聯(lián)

      輸入某二叉樹的前序遍歷和中序遍歷的結果,重建出這棵二叉樹,假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數(shù)字。例如,輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建出這棵滿足前序遍歷和中序遍歷的二叉樹并輸出它的頭結點。

      成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供元江縣企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站建設、成都網(wǎng)站設計H5技術、小程序制作等業(yè)務。10年已為元江縣眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡公司優(yōu)惠進行中。

        對一棵二叉樹前序遍歷的順序是“根結點->左結點->右結點”,而中序遍歷的順序是“左結點->根節(jié)點->右結點”,因此,一般的思路都是醬紫的:

      1. 前序遍歷列表中,第一個數(shù)據(jù)肯定是根節(jié)點,而中序遍歷列表中,第一個數(shù)據(jù)肯定是樹的最左結點,這樣就可以得知,在前序遍歷中,從根結點到最左結點一定是樹的最左分支,也就是“1->2->4”;

      2. 接下來,在中序遍歷中,訪問完最左結點4之后因為其左結點為NULL要訪問的就是4的右分支的最左結點了,為7,而在前序遍歷中訪問到最左結點之后就要訪問右結點,發(fā)現(xiàn)也為7,說明7就是最左結點4的右分支上的最左結點,也就是只有7一個右結點;

      3. 然后,在中序遍歷中訪問完最左結點也就是以4為根節(jié)點子樹之后,就要回到4結點的父節(jié)點了,也就是2,再往下訪問是根節(jié)點1,也就是2并沒有右結點;

      4. 至此會發(fā)現(xiàn)1為根節(jié)點的左子樹已經(jīng)全部訪問完了;

        上面沒有再繼續(xù)往下分析,是因為會發(fā)現(xiàn),上面說的一堆雖然能把樹給重建出來,但是很繁瑣,邏輯上有關聯(lián)卻難以疏通個條理出來,因此要想轉換為代碼來實現(xiàn)想必又是要大費周折;

        為什么分析到第四點就停下了,是因為第四點的式轉換新思路的一個起點:

      1. 首先前面第一點中加粗的字體肯定是沒有問題的,前序遍歷中第一個數(shù)據(jù)一定是樹的根結點

      2. 再結合第四點,在中序遍歷中找到這個根結點,會發(fā)現(xiàn)以1為根結點前面的數(shù)據(jù)都是1的左子樹,有三個結點,那么在前序遍歷中1后面的三個結點都是屬于左子樹的;因此,在1后面的數(shù)據(jù)肯定也都是在1的右子樹上,有四個結點;

      3. 接下來看在前序遍歷中跟在1后面的數(shù)據(jù)2是在1的左邊還是右邊,在左邊就是1的左結點,在右邊就是1的右結點;

      4. 然后按照前序遍歷列表中的順序將2看為新的根結點,那么在它左邊的數(shù)據(jù)就是它左子樹上的,右邊的數(shù)據(jù)就是右子樹上的,當然是截止到前一個根結點1為止;然后就再次循環(huán)從上一步開始;

      可畫圖如下:

      用一棵二叉樹的前序遍歷結果和中序遍歷結果還原這棵二叉樹——6

        是不是會發(fā)現(xiàn)第二次的分析比第一次要簡單明了多了?而且邏輯上有重復性,這樣的分析用代碼實現(xiàn)起來會比較容易,可以用遞歸來實現(xiàn):

      #include 
      #include 
      using namespace std;
      
      typedef int data_type;
      
      //首先定義一個樹結點的結構體并實現(xiàn)構造函數(shù)
      struct BinaryTreeNode
      {
          data_type _data;
          BinaryTreeNode* _Lnode;
          BinaryTreeNode* _Rnode;
      
          BinaryTreeNode(data_type data)
              :_data(data)
              ,_Lnode(NULL)
              ,_Rnode(NULL)
          {}  
      };
      
      //重建二叉樹,參數(shù)為兩個遍歷列表,樹結點的個數(shù),還有遞歸所需要知道子樹的范圍
      BinaryTreeNode* RebuildBinaryTree(const data_type* prevlist, const data_type *inlist, const size_t num, size_t head, size_t tail)
      {
          assert(prevlist && inlist && num);  //判斷參數(shù)有效性
          //前序遍歷列表中第一個結點一定是樹的根結點
          BinaryTreeNode *root = new BinaryTreeNode(*prevlist);
      
          size_t root_index;
          //在中序遍歷列表中找出根結點
          for(root_index = 0; root_index < num; ++root_index)
          {   
              if(inlist[root_index] == *prevlist)
                  break;
          }   
          if(inlist[root_index] != *prevlist)  //檢查給出的序列是否為有效的遍歷序列
          {   
              cout<<"Invalid parameter..."< 0)
              root->_Lnode = RebuildBinaryTree(prevlist+1, inlist, num, head, root_index-1);
      
          size_t right_node_num = tail - root_index;//根結點右邊的結點個數(shù)
          if(right_node_num > 0)
              root->_Rnode = RebuildBinaryTree(prevlist+left_node_num+1, inlist, num, root_index+1, tail);
      
          return root;
      }
      
      //前序遍歷檢查二叉樹是否正確重建
      void PreOrder(BinaryTreeNode *root)
      {
          if(root != NULL)
          {
              cout<_data<<"->";
              PreOrder(root->_Lnode);
              PreOrder(root->_Rnode);
          }
      }
      
      int main()
      {
          data_type PrevOrderList[] = {1, 2, 4, 7, 3, 5, 6, 8};
          data_type InOrderList[] = {4, 7, 2, 1, 5, 3, 8, 6};
      
          size_t node_num = sizeof(PrevOrderList)/sizeof(PrevOrderList[0]);
          //這里的首部和尾部的表示范圍都是在中序遍歷中
          size_t head = 0;
          size_t tail = node_num-1;
          BinaryTreeNode* root = RebuildBinaryTree(PrevOrderList, InOrderList, node_num, head, tail);
      
          cout<<"the root data: "<_data<

      運行程序:

      用一棵二叉樹的前序遍歷結果和中序遍歷結果還原這棵二叉樹——6

      因為只是檢查書是否重建好,用遞歸寫樹的先序遍歷,輸出發(fā)現(xiàn)和給定的先序遍歷序列一樣,則樹重建完成。

      《完》

      另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


      當前文章:用一棵二叉樹的前序遍歷結果和中序遍歷結果還原這棵二叉樹——6-創(chuàng)新互聯(lián)
      標題URL:http://ef60e0e.cn/article/doepeo.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        嘉义县| 白城市| 鄂托克前旗| 宝鸡市| 云阳县| 长沙市| 太白县| 尼勒克县| 友谊县| 定日县| 临桂县| 河南省| 临桂县| 崇州市| 称多县| 化州市| 阿荣旗| 岗巴县| 香河县| 荥经县| 偏关县| 安龙县| 本溪市| 临清市| 玛纳斯县| 惠东县| 九台市| 惠东县| 临泉县| 望谟县| 抚顺县| 昌邑市| 沁阳市| 阿尔山市| 林周县| 太和县| 德阳市| 祁东县| 稻城县| 七台河市| 上虞市|