L2-004 這是二叉搜索樹嗎?

来源:https://www.cnblogs.com/littleLittleTiger/archive/2019/03/10/10506817.html
-Advertisement-
Play Games

題目: 一棵二叉搜索樹可被遞歸地定義為具有下列性質的二叉樹:對於任一結點, 其左子樹中所有結點的鍵值小於該結點的鍵值; 其右子樹中所有結點的鍵值大於等於該結點的鍵值; 其左右子樹都是二叉搜索樹。 所謂二叉搜索樹的“鏡像”,即將所有結點的左右子樹對換位置後所得到的樹。 給定一個整數鍵值序列,現請你編寫 ...


題目:

一棵二叉搜索樹可被遞歸地定義為具有下列性質的二叉樹:對於任一結點,

  • 其左子樹中所有結點的鍵值小於該結點的鍵值;
  • 其右子樹中所有結點的鍵值大於等於該結點的鍵值;
  • 其左右子樹都是二叉搜索樹。

所謂二叉搜索樹的“鏡像”,即將所有結點的左右子樹對換位置後所得到的樹。

給定一個整數鍵值序列,現請你編寫程式,判斷這是否是對一棵二叉搜索樹或其鏡像進行前序遍歷的結果。

輸入格式:

輸入的第一行給出正整數 N(1000)。隨後一行給出 N 個整數鍵值,其間以空格分隔。

輸出格式:

如果輸入序列是對一棵二叉搜索樹或其鏡像進行前序遍歷的結果,則首先在一行中輸出 YES ,然後在下一行輸出該樹後序遍歷的結果。數字間有 1 個空格,一行的首尾不得有多餘空格。若答案是否,則輸出 NO

輸入樣例 1:

7
8 6 5 7 10 8 11

輸出樣例 1:

YES
5 7 6 8 11 10 8

輸入樣例 2:

7
8 10 11 8 6 7 5

輸出樣例 2:

YES
11 8 10 7 5 6 8

輸入樣例 3:

7
8 6 8 5 10 9 11

輸出樣例 3:

NO

 

思路:

我是照著這位大佬的思路寫的:https://blog.csdn.net/m0_38013346/article/details/79676252,作為一個小白,找到一個看得懂的不容易。。

區間遞歸:
對於起始區間,前序遍歷的第一個數就是根結點,[root+1,tail]就是root結點的所有結點。下麵就要找出在這個區間中哪到哪是左子樹,哪到哪是右子樹,然後這兩個區間再繼續遞歸。

具體根據二叉搜索樹必須滿足[root+1,i] < root, [i+1,tail] >= root(本題中,右子樹的結點可以等於根節點);鏡像二叉搜索樹滿足 [root+1,i] >= root,[i+1,tail] < root來找左右子樹的界限。以它們的界限是否相接來判斷當前這層遍歷是否滿足(鏡像)二叉搜索樹前序遍歷的條件。
arr2 數組存放的就是後序遍歷,數組應在子樹遞歸完才添加。

上代碼:

#include <iostream> 
#include <vector>
using namespace std;
vector<int> arr1(1005); //先序遍歷的數組 
vector<int> arr2;  //後序遍歷 
bool tree(int root,int tail)
{
    if(root>tail) //遞歸的最底層 
        return true;
    int i=root+1;
    int j=tail;
    //兩個迴圈找出左子樹和右子樹的範圍 ,左子樹:[root+1,j] 右子樹:[i,tail] 
    while(i<=tail&&arr1[i]<arr1[root])
        i++;
    while(j>root&&arr1[j]>=arr1[root])
        j--;
    if(i!=j+1) //判斷是否為二叉搜索樹 
        return false;
    if(!tree(root+1,j)) return false;
    if(!tree(i,tail)) return false;
    arr2.push_back(arr1[root]);
    return true;
}
bool treeMirror(int root,int tail)
{
    if(root>tail)
        return true;
    int i=root+1,j=tail;
    while(i<=tail&&arr1[i]>=arr1[root])
        i++;
    while(j>root&&arr1[j]<arr1[root])
        j--;
    if(i!=j+1)
        return false;
    if(!treeMirror(root+1,j)) return false;
    if(!treeMirror(i,tail)) return false;
    arr2.push_back(arr1[root]);
    return true;
 } 
 void print()
 {
     cout<<"YES"<<endl;
     int len=arr2.size();
     for(int i=0;i<len-1;i++)
         cout<<arr2[i]<<" ";
    cout<<arr2[len-1];
 }
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>arr1[i];
    }
    if(tree(0,n-1))
    {
        print();        
    }
    else {
            arr2.clear();//清空vector 
            if(treeMirror(0,n-1)) print();
            else printf("NO\n");
        }
    return 0;
}

 

殺不死我的使我更強大_(:з」∠)_


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

-Advertisement-
Play Games
更多相關文章
  • Problem Description In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n. Input The input will consist of a series of integers n, o ...
  • 一、什麼是AOP? Aspect oritention programming(面向切麵編程),AOP是一種思想,高度概括的話是“橫向重覆,縱向抽取”,如何理解呢?舉個例子:訪問頁面時需要許可權認證,如果每個頁面都去實現方法顯然是不合適的,這個時候我們就可以利用切麵編程。 每個頁面都去實現這個方法就是 ...
  • 參考鏈接:1. 解析H264的SPS信息 https://blog.csdn.net/lizhijian21/article/details/80982403 2. h.264的POC計算 https://www.cnblogs.com/TaigaCon/p/3551001.html 3. 視音頻數 ...
  • 綠茶小說系統是綠茶科技旗下自主開發的小說系統,可以​‌‌支持定製小說網站,小說網站開發,小說網站系統,小說網站源碼,小說網站開發建設,小說網站程式,微信小說網站源碼,一套小說網站管理系統,完整版小說,付費看小說,小說下載等欄目版塊,可以支持定製電腦版+手機版+微信版+小程式版+APP版,由10年的技 ...
  • I. 數據類型 Python3將程式中的任何內容統稱為對象(Object),基本的數據類型有數字和字元串等,也可以使用自定義的類(Classes)創建新的類型。 Python3中有六個標準的數據類型: Number(數字) String(字元串) List(列表) Tuple(元組) Set(集合) ...
  • 2019-03-10/20:19:56 演示:將xml配置方式改為註解方式 靜態以及動態代理推薦博客:https://blog.csdn.net/javazejian/article/details/56267036 junit單元測試jar包:https://share.weiyun.com/5p ...
  • 一 :搭建Java環境 (1)打開IE瀏覽器,輸入網址”https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html“ (2)在JDK下載頁面點擊”JDK download” (3)根據提示 ...
  • 本公司專業承接外貿英文網站定製,國外英文網站建設,多語言貿易網站開發,多語言網站製作等服務,支持電腦版,手機版等,並且個性化定製。 網站顯示語言支持:簡體,繁體,英文,韓文,日文,法文等 提供一站式服務:聯繫QQ:2 3 6 0 2 4 8666(私聊),微信:luenmicro 電話:186-75 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...