1. 程式人生 > 其它 >找到搜尋二叉樹中的錯誤結點

找到搜尋二叉樹中的錯誤結點

找到搜尋二叉樹中的錯誤結點

問題重述:

一個二叉搜尋樹,其中的兩個結點位置發生了互換,先給出二叉樹的根節點,要求得到兩個錯誤的結點

問題分析:

因為二叉搜尋樹的結構滿足,當前節點大於左子節點小於右子結點,使用中序遍歷的時候,得到的值是升序的,二叉樹中的兩個結點換了位置,那麼一定會導致中序遍歷得到的值不能夠升序,那麼根據這個我們就可以找到對應的錯誤結點。

有兩種情況:一種是相鄰節點位置互換,那麼中序遍歷結果中第一次出現亂序的結點和之後的結點就是位置錯誤的結點,第二種情況是不相鄰的結點位置互換,那麼中序遍歷結果中會有兩次亂序,錯誤的結點是第一次的最大值和第二次的最小值

解法:

遍歷二叉樹

解題:

程式碼:
public TreeNode[] getErrorNode(TreeNode root){
    TreeNode[] res = new TreeNode[2];
    if(root == null){
        return res;
    }
    // 建立一個棧用於儲存上一次的結點
    Stack<TreeNode> stack = new Stack<TreeNode>();
    // 儲存上一次經過的結點
    TreeNode pre = null;
    // 開始迴圈,迴圈條件是棧不為null或者結點不為null
    while(!staxk.isEmpty() || root != null){
        // 不為null,則向當前結點的左子樹進發
        if(root != null){
            stack.push(root);
            root = root.left;
        }else{
            // 當前節點為null,返回上一次遍歷的結點
        root = stack.pop();
        if(pre != null && pre.value > root.value){
            // 因為是中序遍歷,搜尋二叉樹的順序應該是升序的,這裡上一個結點大於當前結點,那麼這個結點一定是錯誤節點
            // 如果是相鄰的結點錯位,那麼錯誤結點就是當前節點和當前節點的前一個結點,如果是不相鄰的結點錯位,那麼錯誤的結點是第一次亂序的較大結點和第二次亂序的較小結點
            res[0] = res[0] == null ? pre : res[0];
            res[1] = root;
        }
            pre = root;
            root = root.right;
        }
    }
    return res;
}