改造二叉樹(bst)

2021-06-01 11:53:58 字數 1207 閱讀 7893

題目大意:給你一棵二叉樹,讓你改變最少的結點上的數值,使這棵二叉樹變成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 樹可以分為幾個...