二叉树与双向链表的转换
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:二叉搜索树要转成有序的链表,可以想到的是利用中序遍历二叉树,每得到一个输出结点就修改其指针指向,从而构成有序链表。
题解:
/* 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; } };