二叉樹與雙向鏈表的轉換
阿新 • • 發佈:2018-09-09
算法 tac des 二叉 輸出 遞歸算法 || 中序遍歷 ack
題目描述
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。 分析:二叉搜索樹要轉成有序的鏈表,可以想到的是利用中序遍歷二叉樹,每得到一個輸出結點就修改其指針指向,從而構成有序鏈表。 題解:/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree == nullptr) return nullptr; // 非遞歸算法,故用堆棧 stack<TreeNode*> sck; TreeNode *pCur = pRootOfTree; TreeNode *pNode = nullptr; // 存儲前一個輸出結點 TreeNode *pHead = nullptr; // 存儲有序鏈表表頭 while(!sck.empty() || pCur != nullptr) { while(pCur != nullptr) { sck.push(pCur); pCur = pCur->left; } pCur = sck.top(); // 處理輸出結點 if(pNode != nullptr) { pNode->right = sck.top(); sck.top()->left = pNode; pNode = sck.top(); } if(pNode == nullptr) { pNode = sck.top(); pHead = pNode; } pNode = sck.top(); sck.pop(); if(pCur->right) { pCur = pCur->right; } else { pCur = nullptr; } } return pHead; } };
二叉樹與雙向鏈表的轉換