找到搜尋二叉樹中兩個錯誤的節點
一棵二叉樹原本是搜尋二叉樹,但是其中有兩個節點調換了位置,使得這棵二叉樹不再是搜尋二叉樹,請按公升序輸出這兩個錯誤節點的值。(每個節點的值各不相同)
輸入描述:
第一行輸入兩個整數 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...