1. 程式人生 > >牛客原題 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

牛客原題 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public TreeNode Convert(TreeNode root) {
       if(root==null){//假如根節點為空,返回空
        return null;
    }
    if(root.left==null&&root.right==null){//假如只有一個根節點,則返回根節點
        return root;
    }
    //1、將左子樹構造成雙鏈表,並返回該連結串列頭結點left
    TreeNode left=Convert(root.left);

    //2、定位到左子樹連結串列的最後一個節點(左子樹最右邊的節點)
    TreeNode p=left;//建立一個臨時節點P,用來遍歷找到左連結串列的最後一個節點(左子樹最右邊的節點),p初始化指向做左子樹的根節點,
    while(p!=null&&p.right!=null){
        p=p.right;//最終p為左子樹最右邊的節點
    }
    //3、如果左子樹連結串列不為空,將當前root追加到左子樹連結串列後
    if(left!=null){//左子樹連結串列不為空
        p.right=root;//左子樹連結串列的最後一個節點p(左子樹最右邊節點)的右指標指向當前root節點
        root.left=p;//當前root節點的左指標指向左子樹連結串列的最後一個節點p(左子樹最右邊節點)
    }
    //4、將右子樹構造成雙鏈表,並返回該連結串列的頭結點right
    TreeNode right=Convert(root.right);

    //5、如果右子樹連結串列不為空,將右子樹連結串列追加到當前root後
    if(right!=null){//右子樹連結串列不為空
        right.left=root;//右子樹連結串列的頭結點right的左指標指向當前root
        root.right=right;//當前root的右指標指向右子樹連結串列的頭結點right
    }
    return left!=null?left:root;//根據左子樹連結串列是否為空返回整個雙向連結串列的頭指標。    
    }
}