題目描述:旋轉是二叉樹的基本操作,我們可以對任意乙個存在父親節點的子節點進行旋轉,包括如下幾種形式(設被旋轉節點為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
5353
#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...