b_nk_找到搜索二叉树中两个错误的节点(利用特性)
_找到搜索二叉树中两个错误的节点(输入输出)
搜索二叉树中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请按升序输出这两个错误节点的值
思路:中序遍历+枚举
class node(object):
def __init__(self,l,r):
self.l=l
self.r=r
def dfs(u):
if u==0: return
dfs(g[u].l)
B.append(u)
dfs(g[u].r)
A=input().split()
n,root=int(A[0]),int(A[1])
B,ans,g=[],[],[0]*(n+1)
for i in range(n):
A=input().split()
fa,lc,rc=int(A[0]),int(A[1]),int(A[2])
g[fa]=node(lc,rc)
dfs(root)
for i in range(n):
if B[i]!=i+1:
ans.append(i+1)
print(ans[0], ans[1])
找到搜索二叉树中两个错误的节点(核心代码)
思路: 中序遍历+用pre记录当前结点的前一个结点,两个结点交换了会发生什么?第一个降序结构的第一个结点是err[0],最后一个降序结构的第一个结点是err[1]
class Solution {
public:
vector<int> findError(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* pre=NULL;
int u=-1,v;
while (!st.empty() || root!=NULL) {
if (root!=NULL) {
st.push(root);
root=root->left;
} else {
root=st.top(); st.pop();
if (pre!=NULL && pre->val>root->val) {
if (u==-1) u=pre->val;
v=root->val;
}
pre=root;
root=root->right;
}
}
return {v,u};
}
};