佇列安排 二叉樹

2021-09-11 00:28:04 字數 1540 閱讀 9169

乙個學校裡老師要將班上n個同學排成一列,同學被編號為1\sim n1∼n,他採取如下的方法:

先將1號同學安排進佇列,這時佇列中只有他乙個人;

2-n2−n號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1∼(i−1)中某位同學(即之前已經入列的同學)的左邊或右邊;

從佇列中去掉m(m

在所有同學按照上述方法佇列排列完畢後,老師想知道從左到右所有同學的編號。

輸入格式:

第11行為乙個正整數n,表示了有n個同學。

第2-n2−n行,第ii行包含兩個整數k,pk,p,其中k為小於ii的正整數,pp為00或者11。若p為0,則表示將ii號同學插入到k號同學的左邊,p為1則表示插入到右邊。

第n+1行為乙個正整數m,表示去掉的同學數目。

接下來m行,每行乙個正整數x,表示將x號同學從佇列中移去,如果x號同學已經不在佇列中則忽略這一條指令。

輸出格式:

11行,包含最多n個空格隔開的正整數,表示了佇列從左到右所有同學的編號,行末換行且無空格。

輸入樣例#1:複製

4

1 02 1

1 02

33

輸出樣例#1:複製

2 4 1
樣例解釋:

將同學22插入至同學11左邊,此時隊列為:

2 121

將同學33插入至同學22右邊,此時隊列為:

2 3 1231

將同學44插入至同學11左邊,此時隊列為:

2 3 4 12341

將同學33從佇列中移出,此時隊列為:

2 4 1241

同學33已經不在佇列中,忽略最後一條指令

最終佇列:

2 4 1241

資料範圍

對於20\%20%的資料,有n≤10n≤10;

對於40\%40%的資料,有n≤1000n≤1000;

對於100\%100%的資料,有n, m≤100000n,m≤100000。

解析:這題裡面涉及到插入和刪除,大家可以用鍊錶做,但是需要雙向鍊錶,所以我們這裡用二叉樹,因為這裡有左右兩個方向,這跟二叉樹兩個方向的原理很相同。

所以我們上**:

#includeusing namespace std;

struct node

q[200002];

int n, m;

void dfs(int x)///然後中序遍歷輸出

int main()

else

q[x].lef = i;

} else

else

q[x].rig = i;

} }cin >> m;

for (int i = 1; i <= m; i++)//將刪除的節點的vi標記為-1

dfs(1);

return 0;

}

佇列,二叉樹

一 佇列。1 什麼是佇列?在一條儲存結構中,插入節點與刪除節點分別在兩端進行,例如 插入資料在隊尾插入,刪除資料在隊頭進行,那麼這種邏輯關係就是叫做佇列,其特點 先進先出,後進後出。插入資料到佇列中 入隊。從佇列中刪除資料 出隊。2 設計佇列管理結構體和節點結構體。1 管理佇列的結構體。struct...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...