1. 程式人生 > >根據中序遍歷順序構建完全二叉搜尋樹-04-樹6 Complete Binary Search Tree (30分)

根據中序遍歷順序構建完全二叉搜尋樹-04-樹6 Complete Binary Search Tree (30分)

  • 題目分析
    題目就是給出一棵完全二叉搜尋樹的各個結點的值,然後讓我們輸出該樹層序遍歷的結果。
    我們首先可以分析一下,完全二叉搜尋樹 有什麼特點?顯然可以知道:
    1.它是一棵完全二叉樹,那麼可以用陣列方式來儲存(如 a[] 來儲存)。如果從下標1開始儲存,那麼任何一個結點 a[i] ,它的左孩子為 a[2*i] ,右孩子為 a[2*i+1] (如果有的話)。
    2.它還是一棵搜尋樹,那麼它中序遍歷的結果一定是從小到大的。
    然後我們可以試著將問題轉化,很容易想到,我們可以將給出的結點從小到大排序,那麼就相當於是得到了該 完全二叉搜尋樹 的 中序遍歷 的結果。
    問題就轉化為:如何根據中序遍歷的結果來構造這棵完全二叉搜尋樹 。
    想一想這棵樹是用陣列來儲存的,再想一想中序遍歷的特點(先遍歷左子樹,然後輸出根結點,然後遍歷右子樹)。
    我們先申請好了完全二叉搜尋樹的空間,現在裡面是空的,那麼我們來中序遍歷這棵空的完全二叉搜尋樹,遍歷的時候就把真正中序遍歷的結果放進去這棵樹中,那麼我們就構造出了這棵完全二叉搜尋樹。

  • 我的程式碼

#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 1005;
int a[maxn],t[maxn]; //t[]儲存結果,即是那個 完全二叉搜尋樹
int n,pos=1;//pos儲存a[]的下標,從1開始

//按照中序遍歷的方式來構造這棵完全二叉搜尋樹 
void inOrder(int index)
{
    if(index*2 <= n)    inOrder(index*2);
    t[index] = a[pos++];//這裡的遍歷就是賦值,一般情況下的遍歷是輸出
if(index*2+1 <= n) inOrder(index*2+1); } int main() { cin>>n; for(int i=1; i<=n; i++) { cin>>a[i]; } sort(a+1,a+n+1);//排序之後a[]中儲存的就是中序遍歷的結果 inOrder(1);//從根結點1開始中序遍歷 //層序輸出,由於陣列儲存完全二叉樹的性質,層序輸出就是順序輸出 for(int i=1; i<=n; i++) { cout
<<t[i]; if(i != n) cout<<" "; } cout<<endl; }