【劍指Offer】【樹】【雙向鏈表】二叉搜索樹與雙向鏈表


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

 

A:二叉樹中每個節點都有一個left指針指向左節點,一個right指針指向右節點

  雙向鏈表中每個節點都有一個prev指針指向前驅節點,一個next指針指向后繼節點

  在二叉搜索樹中,左節點小於父節點,右節點大於父節點;

  在排序雙向鏈表中,前驅節點小於當前節點,后繼節點大於當前節點

得到以下轉化方案:

  中序遍歷二叉搜索樹

 

  轉化當前節點的左節點converTree(pTree->left, prev);  

 

  找到當前節點pTree,pTree->left = prev

  如果prev不為空,則prev->next = pTree

  prev = prev->next往后移動

 

  轉化當前節點的右節點

 

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    void converTree(TreeNode * pTree, TreeNode *&prev)    //二級指針 = 指針引用  (降級,可以直接用pre操作,否則要*pre)
    {
        if(pTree == nullptr)
        {
            return ;
        }
        converTree(pTree->left, prev);
        
        pTree->left = prev;
        if(prev != nullptr)
        {
            prev->right = pTree;
        }
        prev = pTree;
        
        converTree(pTree->right, prev);
    }
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == nullptr)
        {
            return nullptr;
        }
        TreeNode *pTree = nullptr;
        //轉化
        converTree(pRootOfTree,pTree);
        //輸出頭節點
        TreeNode *ret = pRootOfTree;
        while(ret->left != nullptr)
        {
            ret = ret->left;
        }
        return ret;
    }
};

  

 

 


免責聲明!

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



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