日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

改造二叉树

發(fā)布時(shí)間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 改造二叉树 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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的方法做

.
.
.
.
.
程序:

#include<iostream> #include<cstdio> #include<cstring> using namespace std;int l[100010],r[100010],a[100010],tj=0,f[100010],s[100010],n;inline int read() {int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();return s*w; }int ef(int l,int r,int x) {while (l<=r){int mid=(l+r)/2;if (f[mid]<=x) l=mid+1; else r=mid-1;}return l; }void dfs(int x) {if (x==0) return;dfs(l[x]);s[++tj]=a[x];dfs(r[x]); }int main() {n=read();for (int i=1;i<=n;i++)a[i]=read();for (int i=2;i<=n;i++){int fa,ch;fa=read();ch=read();if (ch==0) l[fa]=i; else r[fa]=i;}dfs(1);for (int i=1;i<=n;i++)s[i]-=i;int w=1;f[w]=s[1];for (int i=2;i<=n;i++){if (s[i]>=f[w]) f[++w]=s[i]; else f[ef(1,w,s[i])]=s[i];}printf("%d",n-w);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/10458944.html

總結(jié)

以上是生活随笔為你收集整理的改造二叉树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。