改造二叉樹

2021-09-10 05:55:10 字數 1263 閱讀 6565

description

小y在學樹論時看到了有關二叉樹的介紹:在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作「左孩子」和「右孩子」。二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。

什麼是二叉搜尋樹呢?二叉搜尋樹首先是一棵二叉樹。設key[p]表示結點p上的數值。對於其中的每個結點p,若其存在左孩子lch,則key[p]>key[lch];若其存在右孩子rch,則key[p]input

第一行乙個正整數n表示二叉樹結點數。結點從1~n進行編號。

第二行n個正整數用空格分隔開,第i個數ai表示結點i的原始數值。

此後n - 1行每行兩個非負整數fa, ch,第i + 2行描述結點i + 1的父親編號fa,以及父子關係ch,(ch = 0 表示i + 1為左兒子,ch = 1表示i + 1為右兒子)。

結點1一定是二叉樹的根。

output

僅一行包含乙個整數,表示最少的修改次數。

sample input

32 2 2

1 01 1

sample output

2data constraint

20 % :n <= 10 , ai <= 100.

40 % :n <= 100 , ai <= 200

60 % :n <= 2000 .

100 % :n <= 10 ^ 5 , ai < 2 ^ 31.

題意:給你一顆二叉樹,通過改變節點的值使:左《中《右。

解析:首先中序遍歷一遍,將結果放在f陣列中,將得到的數每個減去i,i的範圍是1-n,理由是:2134這樣的數直接用lts得到的結果為1,實際結果是2,(不允許出現小數)再用最長不下降子串行(lts)加二分求出答案,

#include #include using namespace std;

const int n=1e9, m=-1e9;

long long ans,b[100001][2],f[100001];

long long n;

struct a

a[100001];

void dfs(int x)//中序遍歷

int lis()//最長不下降子串行

d[l]=f[i];

} }return c;

}int main()

dfs(1);

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

f[i]-=i;

cout

}

改造二叉樹

題目描述 小y在學樹論時看到了有關二叉樹的介紹 在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作 左孩子 和 右孩子 二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。什麼是二叉搜尋樹呢?二叉搜尋樹首先是一棵二叉樹。設key p 表示結點p上的數值。對於其中的...

改造二叉樹(bst)

題目大意 給你一棵二叉樹,讓你改變最少的結點上的數值,使這棵二叉樹變成bst,求這個需要改變的最少的結點數。演算法 二分 dp 一開始就沒理解題目問的真正內涵,想了半天的樹型dp,結果肯定是果斷不對,看了題解才知道bst就是二叉樹中序遍歷之後保持有序,進一步得知其實就是要我們求lis。將這棵二叉樹中...

改造二叉樹 Tree LTS

noip2014模擬10.26 改造二叉樹 standard io time limits 1000 ms memory limits 262144 kb description 小y在學樹論時看到了有關二叉樹的介紹 在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作 左孩子 ...