將一個二叉搜索樹轉化爲有序雙向鏈表

題目:

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

解題思路:

    根據二叉搜索樹的特點,左子樹的結點<根節點<右子樹的結點,我們可以按照二叉樹中序遍歷的順序對該二叉樹的指針進行調整,使得二叉樹變爲一個有序的雙向鏈表。

    採用遞歸的思路,先對左子樹進行轉換,

    再處理根節點,讓根節點的做指針指向它的前驅節點;如果其前驅節點非空,讓其前驅節點的右指針指向當前結點。注意更新前驅節點;

    最後處理右子樹,對右子樹進行轉換。

代碼實現:

void TreeToList(TreeNode* pRootOfTree, TreeNode** prev)
    {
        if(pRootOfTree == NULL)
            return;
        //先對左子樹進行轉化
        TreeToList(pRootOfTree->left, prev);
        //處理當前結點,讓當前結點的左指針指向中序遍歷的前驅節點,如果前驅節點非空,讓前驅節點的右指針指向當前結點
        pRootOfTree->left = *prev;
        if(*prev)
            (*prev)->right = pRootOfTree;
        //更新前驅節點
        *prev = pRootOfTree;
        //在對右子樹進行轉化
        TreeToList(pRootOfTree->right, prev);
    }
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == NULL)
            return NULL;
        //查找鏈表的頭結點
        TreeNode* head = pRootOfTree;
        while(head->left != NULL)
        {
            head = head->left;
        }
        //根據中序遍歷的思路進行轉換
        TreeNode* prev = NULL;
        TreeToList(pRootOfTree, &prev);
        return head;
    }

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