尋找錯誤結點

題目:一棵二叉樹原本是搜索二叉樹,但是其中有兩個節點調換了位置,使得這棵二叉樹不再是搜索二叉樹,請找到這兩個錯誤節點並返回他們的值。保證二叉樹中結點的值各不相同。

給定一棵樹的根結點,請返回兩個調換了位置的值,其中小的值在前。

Java代碼:

import java.util.*;


/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
public class FindErrorNode {
    public int[] findError(TreeNode node) {
        /*
        二叉搜索樹的中序遍歷,依次出現的值會一直升序,如果兩個節點值錯了,那麼會出現降序。
        第一個錯誤節點爲第一次降序時較大的節點,第二個錯誤節點是最後一次降序時較小的節點。
        該程序是一個改寫的中序遍歷。(本文用非遞歸模式)
        */
        int[] res=new int[2];
        TreeNode[] err=new TreeNode[2];
    Stack<TreeNode> st=new Stack<TreeNode>();
    TreeNode cur=node;
    TreeNode point=null;//用來比較的第一個元素
    while(!st.isEmpty()||cur!=null)
        {
        if(cur!=null)
            {
           st.push(cur);
            cur=cur.left;
        }else
            {
             cur=st.pop();
        if(point!=null&&point.val>cur.val)
            {
            err[0]=err[0]==null?point:err[0];//err[0]是空的,值爲point,否則值不變
            err[1]=cur;
        }
         point=cur;
         cur=cur.right;//cur.right存在cur=cur.right,否則cur爲null。開始下一次的循環。
        }
    }
        
        res[1]=err[0].val;
        res[0]=err[1].val;
        return res;


    } 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章