找到搜尋二叉樹中兩個錯誤的節點

2021-10-09 07:22:11 字數 1373 閱讀 2660

找到搜尋二叉樹中兩個錯誤的節點

一棵二叉樹原本是搜尋二叉樹,但是其中有兩個節點調換了位置,使得這棵二叉樹不再是搜尋二叉樹,請按公升序輸出這兩個錯誤節點的值。(每個節點的值各不相同)

輸入描述:

第一行輸入兩個整數 n 和 root,n 表示二叉樹的總節點個數,root 表示二叉樹的根節點。

以下 n 行每行三個整數 fa,lch,rch,表示 fa 的左兒子為 lch,右兒子為 rch。(如果 lch 為 0 則表示 fa 沒有左兒子,rch同理)

ps:節點的編號就是該節點的值。

輸出描述:

請按公升序輸出這兩個錯誤節點的值。

示例1輸入

3 1

1 2 3

2 0 0

3 0 0

輸出
1 2
備註:

1 ≤n

≤5∗1

05

1 \leq n \leq 5*10^5

1≤n≤5∗

1051≤f

a,lc

h,rc

h,ro

ot≤n

1 \leq fa,lch,rch,root \leq n

1≤fa,l

ch,r

ch,r

oot≤

n 題解:搜尋二叉樹有乙個特徵:中序遍歷的序列是公升序,那麼我們可以以此作為突破點。如果有兩個節點進行了交換,那麼在新的二叉樹中序遍歷中一定會出現降序子串行(可能一次:相鄰節點;可能兩次:不相鄰節點),其中第乙個錯誤節點為第一次降序時較大的節點,第二個錯誤節點為最後一次降序時較小的節點。

**:

#include

using

namespace std;

const

int n =

500010

;struct bst bst[n]

;int n, rt;

int fa, lch, rch;

int err[2]

;void

inorder

(int root,

int& pre)

pre = root;

inorder

(bst[root]

.rch, pre);}

intmain

(void

)int pre =0;

inorder

(rt, pre)

;printf

("%d %d\n"

, bst[err[1]

].val, bst[err[0]

].val)

;return0;

}

尋找搜尋二叉樹中兩個錯誤的節點

題目 一顆二叉樹原本是搜尋二叉樹,但是其中有兩個節點調換了位置,使得這顆二叉樹不再是搜尋二叉樹,請找到兩個錯誤節點並返回。已知二叉樹中所有節點的值都不一樣,給定二叉樹的頭節點head,返回乙個長度為2的二叉樹節點型別的陣列errs,errs 0 表示乙個錯誤節點,errs 1 表示另乙個錯誤節點。思...

二叉樹問題 尋找搜尋二叉樹中兩個錯誤的節點

題目 一棵二叉樹原本是搜尋二叉樹,但是其中有兩個節點調換了位置,使得這棵二叉樹不再是搜尋二叉樹,請找出這兩個錯誤的節點並返回。已知二叉樹中所有節點的值都不一樣,給定二叉樹的頭節點,返回乙個長度為2的二叉樹節點型別的陣列errs。def gettwoerrornode root errs none f...

牛客題霸 找到搜尋二叉樹中兩個錯誤的節點

題目描述 一棵二叉樹原本是搜尋二叉樹,但是其中有兩個節點調換了位置,使得這棵二叉樹不再是搜尋二叉樹,請按公升序輸出這兩個錯誤節點的值。每個節點的值各不相同 示例1輸入 返回值 1,2 備註 1 leq n leq 5 times 10 51 n 5 105說明 本題目包含複雜資料結構treenode...