【劍指offer】二叉搜索樹轉雙向鏈表,C++實現


原創博文,轉載請注明出處!

# 題目

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

  • 二叉樹節點的定義
 struct TreeNode
 {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;        
}        
  • 二叉搜索樹轉雙向鏈表的例子

image

# 思路

  • 二叉搜索樹的性質
    • 二叉搜索樹是左子樹<根節點<右子樹
    • 二叉搜索樹的中序遍歷是遞增的有序序列
  • 二叉搜索樹轉雙向鏈表的思路
    • 首先:利用BST的中序遍歷得到有序序列(遞歸)
    • 其次:通過調整節點指針,將有序鏈表調整為雙向鏈表

image

# 代碼

class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == nullptr) return nullptr;

        // 雙向鏈表尾節點
        TreeNode* list_last = nullptr;

        // 遞歸建立雙向鏈表
        ConvertNode(pRootOfTree,list_last);

        // 查找雙向鏈表首節點
        while(list_last->left != nullptr)
        {
            list_last = list_last->left;
        }

        // 返回雙向鏈表的首節點
        return list_last;
    }

    // 對BST中序遍歷,得到有序序列;調整序列元素的指針,將有序序列調整為雙向鏈表
    void ConvertNode(TreeNode* cur,TreeNode *&list_last) // 注意形參
    {
        // 邊界條件(遞歸出口)
        if(cur==nullptr) return ;

        // 遍歷左子樹
        if(cur->left != nullptr) ConvertNode(cur->left,list_last);

        // 建立雙向鏈接
        cur->left = list_last;                           // 單側鏈接
        if(list_last != nullptr) list_last->right = cur; // 單側鏈接
        list_last = cur;

        //遍歷右子樹
        if(cur->right != nullptr) ConvertNode(cur->right,list_last);
    }
};

 


免責聲明!

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



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