改造二叉树
Description
小Y在學(xué)樹論時(shí)看到了有關(guān)二叉樹的介紹:在計(jì)算機(jī)科學(xué)中,二叉樹是每個(gè)結(jié)點(diǎn)最多有兩個(gè)子結(jié)點(diǎn)的有序樹。通常子結(jié)點(diǎn)被稱作“左孩子”和“右孩子”。二叉樹被用作二叉搜索樹和二叉堆。隨后他又和他人討論起了二叉搜索樹。
什么是二叉搜索樹呢?二叉搜索樹首先是一棵二叉樹。設(shè)key[p]表示結(jié)點(diǎn)p上的數(shù)值。對(duì)于其中的每個(gè)結(jié)點(diǎn)p,若其存在左孩子lch,則key[p]>key[lch];若其存在右孩子rch,則key[p]<key[rch];注意,本題中的二叉搜索樹應(yīng)滿足對(duì)于所有結(jié)點(diǎn),其左子樹中的key小于當(dāng)前結(jié)點(diǎn)的key,其右子樹中的key大于當(dāng)前結(jié)點(diǎn)的key。
小Y與他人討論的內(nèi)容則是,現(xiàn)在給定一棵二叉樹,可以任意修改結(jié)點(diǎn)的數(shù)值。修改一個(gè)結(jié)點(diǎn)的數(shù)值算作一次修改,且這個(gè)結(jié)點(diǎn)不能再被修改。若要將其變成一棵二叉搜索樹,且任意時(shí)刻結(jié)點(diǎn)的數(shù)值必須是整數(shù)(可以是負(fù)整數(shù)或0),所要的最少修改次數(shù)。
相信這一定難不倒你!請(qǐng)幫助小Y解決這個(gè)問(wèn)題吧。
Input
第一行一個(gè)正整數(shù)n表示二叉樹結(jié)點(diǎn)數(shù)。結(jié)點(diǎn)從1~n進(jìn)行編號(hào)。
第二行n個(gè)正整數(shù)用空格分隔開,第i個(gè)數(shù)ai表示結(jié)點(diǎn)i的原始數(shù)值。
此后n - 1行每行兩個(gè)非負(fù)整數(shù)fa, ch,第i + 2行描述結(jié)點(diǎn)i + 1的父親編號(hào)fa,以及父子關(guān)系ch,(ch = 0 表示i + 1為左兒子,ch = 1表示i + 1為右兒子)。
結(jié)點(diǎn)1一定是二叉樹的根。
Output
僅一行包含一個(gè)整數(shù),表示最少的修改次數(shù)。
Sample Input
3
2 2 2
1 0
1 1
Sample Output
2
Data Constraint
20 % :n <= 10 , ai <= 100.
40 % :n <= 100 , ai <= 200
60 % :n <= 2000 .
100 % :n <= 10 ^ 5 , ai < 2 ^ 31.
.
.
.
.
.
分析
首先求出這顆二叉樹的中序遍歷,那么問(wèn)題就轉(zhuǎn)換成用最少的修改次數(shù)使這個(gè)整
數(shù)序列嚴(yán)格單調(diào)遞增
要用O(n log n)的求LIS的方法做
.
.
.
.
.
程序:
轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/10458944.html
總結(jié)