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])

https://www.nowcoder.com/practice/9caad175642e4651a175e6993df9d8b2?tpId=101&&tqId=33237&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking

找到搜索二叉树中两个错误的节点(核心代码)


思路: 中序遍历+用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};
    }
};
posted @ 2020-11-30 11:51  童年の波鞋  阅读(233)  评论(0编辑  收藏  举报