題目大意:給你一棵二叉樹,讓你改變最少的結點上的數值,使這棵二叉樹變成bst,求這個需要改變的最少的結點數。
演算法:二分+dp
一開始就沒理解題目問的真正內涵,想了半天的樹型dp,結果肯定是果斷不對,看了題解才知道bst就是二叉樹中序遍歷之後保持有序,進一步得知其實就是要我們求lis。。
將這棵二叉樹中序遍歷,然後再求它的lis即可。最後用總的-最長上公升的就是需要最少的需要改變的。
下面是70分的**,未ac。。。
program bst;
const
maxn=100000;
var a,f,lc,rc,ans,miku:array [0..maxn] of longint;
n,tot:longint;
procedure init;
var i,x:longint;
begin
fillchar(ans,sizeof(ans),0);
readln(n);
for i:=1 to n do read(a[i]);
for i:=2 to n do
begin
readln(f[i],x);
if x=0 then lc[f[i]]:=i else rc[f[i]]:=i;
end;
end;
procedure bianli(x:longint);
begin
if x=0 then exit;
bianli(lc[x]);
inc(tot);
ans[tot]:=a[x];
bianli(rc[x]);
end;
procedure main;
var i,l,r,ika,mid:longint;
begin
ika:=0;
miku[0]:=-maxlongint;
for i:=1 to tot do
begin
if ans[i]>miku[ika] then
begin
inc(ika);
miku[ika]:=ans[i];
endelse
begin
l:=1;
r:=ika;
while lmiku[mid] then l:=mid+1 else r:=mid;
end;
if ans[i]
改造二叉樹
description 小y在學樹論時看到了有關二叉樹的介紹 在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作 左孩子 和 右孩子 二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。什麼是二叉搜尋樹呢?二叉搜尋樹首先是一棵二叉樹。設key p 表示結點p上的數...
改造二叉樹
題目描述 小y在學樹論時看到了有關二叉樹的介紹 在電腦科學中,二叉樹是每個結點最多有兩個子結點的有序樹。通常子結點被稱作 左孩子 和 右孩子 二叉樹被用作二叉搜尋樹和二叉堆。隨後他又和他人討論起了二叉搜尋樹。什麼是二叉搜尋樹呢?二叉搜尋樹首先是一棵二叉樹。設key p 表示結點p上的數值。對於其中的...
查詢二叉樹(BST)
今天分享一些關於bst的內容 一 基礎知識點 1 一棵樹最上面的節點稱為根節點,如果乙個節點下面連線多個節點,那麼該節點稱為父節點,它下面的節點稱為子節點。乙個節點可以有0個 1個 或多個子節點,沒有任何子節點的節點稱為葉子節點 2 以某種特定的順序訪問樹中所有的節點稱為樹的遍歷 3 樹可以分為幾個...