改造二叉树
Description
小Y在學樹論時看到了有關二叉樹的介紹:在計算機科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作“左孩子”和“右孩子”。二叉樹被用作二叉搜索樹和二叉堆。隨后他又和他人討論起了二叉搜索樹。
什么是二叉搜索樹呢?二叉搜索樹首先是一棵二叉樹。設key[p]表示結點p上的數值。對于其中的每個結點p,若其存在左孩子lch,則key[p]>key[lch];若其存在右孩子rch,則key[p]<key[rch];注意,本題中的二叉搜索樹應滿足對于所有結點,其左子樹中的key小于當前結點的key,其右子樹中的key大于當前結點的key。
小Y與他人討論的內容則是,現在給定一棵二叉樹,可以任意修改結點的數值。修改一個結點的數值算作一次修改,且這個結點不能再被修改。若要將其變成一棵二叉搜索樹,且任意時刻結點的數值必須是整數(可以是負整數或0),所要的最少修改次數。
相信這一定難不倒你!請幫助小Y解決這個問題吧。
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
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.
.
.
.
.
.
分析
首先求出這顆二叉樹的中序遍歷,那么問題就轉換成用最少的修改次數使這個整
數序列嚴格單調遞增
要用O(n log n)的求LIS的方法做
.
.
.
.
.
程序:
轉載于:https://www.cnblogs.com/YYC-0304/p/10458944.html
總結