【劍指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;
}
};


浙公網安備 33010602011771號