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