題目描述
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向.
第一種方法:
class Solution {
public:
void buildseq(TreeNode* pRootOfTree)
{
if (pRootOfTree != NULL){ //各元素依次入棧
buildseq(pRootOfTree->left);
node.push_back(pRootOfTree);
buildseq(pRootOfTree->right);
}
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
int i;
buildseq(pRootOfTree);
if (node.size() == 0)head=NULL; //修改前後鄰居
else{
head = node[0];
for (i = 0; i < node.size()-1; i++){
node[i]->right = node[i + 1];
node[i + 1]->left = node[i];
}
}
return head;
}
vector<TreeNode *>node;
TreeNode * head=NULL;
};
這種方法思想比較簡單,先中序遍歷二叉樹,將每個結點保存在容器裏,然後對容器裏面的元素進行首尾相連;
第二種方法:
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree){
if (pRootOfTree == 0) return 0; //空樹①
TreeNode *head = 0;
if (pRootOfTree->left == 0 && pRootOfTree->right == 0)return pRootOfTree;
TreeNode* lhead = 0;
TreeNode* rhead = 0;
if (pRootOfTree->left != 0) {
lhead = Convert(pRootOfTree->left); //返回左子樹的頭結點④
head = lhead;
while (lhead->right)lhead = lhead->right;
lhead->right = pRootOfTree; //左子樹進行鏈接,直接向右搜索
pRootOfTree->left = lhead;
}
else head = pRootOfTree; //⑤
if (pRootOfTree->right != 0) { //能到這裏說明只有根的左子樹爲空,則根結點肯是這這顆樹的lead
rhead = Convert(pRootOfTree->right);
pRootOfTree->right = rhead;
rhead->left = pRootOfTree;
}
return head; //將子樹的最左結點一直返回
} //直到根結點
};
這種方法在原地進行操作,無需容器,通過這種方法建立的雙向鏈表的頭結點的left指針域爲空,尾節點的right指針域爲空,最後要調整這兩個結點的指針域才能構成完全
首尾相連的雙向鏈表!!!