面試題27 : BST轉成雙向鏈表


標簽: 算法


初始描述:輸入一棵二叉搜索樹,將其轉換為一個排序的雙向鏈表。要求:不能創建任何新的結點,只能調整樹中結點指針的指向。

思路

  1. 二叉搜索樹的特性是,其中序遍歷是有序的,同時左子樹的元素都比根結點小,右子樹的元素都比根節點大。
  2. 由上述特性可知,把二叉搜索樹轉換成雙向鏈表后,根節點的前一個元素是左子樹的最右邊結點,根結點的后一個元素是右子樹的最左邊結點。
  3. 左子樹和右子樹的轉換過程是一樣的,所以是一個遞歸的過程。
  4. 注意,轉換后返回的是指向雙向鏈表的頭指針。
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        // 根節點為空
        if(pRootOfTree == null) return null;
        
        if(pRootOfTree.left != null){
            // 先轉換左子樹,獲得轉換后的頭指針
            TreeNode left = Convert(pRootOfTree.left);
            
            // 獲得指向左子樹的最后一個元素的指針
            while(left.right != null) left = left.right;
            
            // 與root鏈接,注意雙向
            pRootOfTree.left = left;
            left.right = pRootOfTree;
        }
        
        if(pRootOfTree.right != null){
            // 同理,轉換右子樹
            TreeNode right = Convert(pRootOfTree.right);
            
            // 獲得指向右子樹的第一個元素的指針,這里直接就是right,與root雙向鏈接
            pRootOfTree.right = right;
            right.left = pRootOfTree;
        }
        
        // 最后把pRootOfTree指向雙向鏈表的第一個元素再返回
        while(pRootOfTree.left != null){
            pRootOfTree = pRootOfTree.left;
        }
        
        return pRootOfTree;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM