九度OJ 1541 二叉樹 資料結構

2022-07-27 22:03:22 字數 1753 閱讀 8224

題目描述:旋轉是二叉樹的基本操作,我們可以對任意乙個存在父親節點的子節點進行旋轉,包括如下幾種形式(設被旋轉節點為x,其父親節點為p):

1.左旋

旋轉前,x是p的右兒子。

x的左兒子(若存在)變為p的右兒子,p變為x的左兒子。如下圖

2.右旋

旋轉前,x是p的左兒子。

x的右兒子(若存在)變為p的左兒子,p變為x的右兒子。如下圖

綜上,我們可以通過檢查選擇前x是p的左兒子還是右兒子來判斷該次旋轉是左旋還是右旋。

給定一顆n個節點的二叉樹,其節點由1至n編號,並給定一系列操作,如下:

1.rotate x,對編號x的節點進行旋轉,若x為根節點,則不進行任何操作。

2.parent x,輸出編號x的父親節點編號,若x為根節點輸出-1。

3.size x,輸出以x為根節點的子樹的節點個數。

輸入:輸入包含多組測試用例。

每組測試用例開頭為乙個整數n(1<=n<=1000),代表二叉樹的節點個數。

接下去n行描述,二叉樹原始的狀態,第i行為兩個整數x,y,代表i號節點的左兒子節點為x號節點,右兒子節點為y號節點,若x或y為-1,則表示相應兒子節點不存在。編號的範圍為1到n。

接下去一行為乙個整數t(1<=t<=50000),代表操作的個數。

最後t行,每行代表乙個對二叉樹的操作,描述如上所示。

輸出:對於每組測試用例,輸出操作parent x和size x查詢的資料。

樣例輸入:

5

2 3-1 -1

4 5-1 -1

-1 -1

5size 1

rotate 5

size 5

parent 3

parent 4

樣例輸出:

535

3

#include #include typedef struct nodenode;

node tree[1001];

int has_parent[1001];

int size[1001];

int n;

int root;

int compute(int node)

int size(int node)

void rotate(int node)

if (parent == root)

root = node;

tree[parent].parent = node;

if (tree[parent].right == node)

}else

}size[node] = size[parent];

size[parent] = compute(tree[parent].left) + compute(tree[parent].right) + 1;

}} int main(void)

if (tree[i].right != -1)

}for (i = 1; i <= n; ++i)

if (has_parent[i] != 1)

for (i = 1; i <= n; ++i)

size(i);

scanf("%d", &t);

while (t-- != 0)

}return 0;

}

九度 題目1541 二叉樹

二叉樹的操作,旋轉操作就按他給的圖來進行吧,需要細心,要把各節點的兒子父親安排的妥妥的.還有不知道他是一棵還是多棵二叉樹.include include includeusing namespace std define n 2010 struct node root n int n,q,r,val...

資料結構OJ作業 二叉樹

題目傳送門 tree recovery 給出乙個二叉樹的前序和中序,求二叉樹的後序。節約空間,並不實際建樹,而是一邊搜尋一邊輸出。同hdoj1710,寫完了這篇blog才發現以前也寫過,尷尬 include include using namespace std char pre 30 in 30 ...

九度OJ 1113 二叉樹

題目1113 二叉樹 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 2599 解決 778 題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13...