您的位置:首页 > Web前端

剑指offer(27)——二叉搜索树与双向链表

2017-08-10 16:44 239 查看

题目



分析

可以在纸上画出一个二叉搜索树,把它转化为一个双向链表,我们不难发现:在二叉搜索树中,每个节点的指向左孩子的指针让它指向它的前一个节点,指向右孩子的指针让它指向它的后一个节点,经过这样的转换,二叉搜索树就转化成为一个双向链表。思想就是这样,理解思想代码实现也就不难了。还有一点就是,这棵树的根节点总比左孩子大比右孩子小,再转化为为双向链表时对应该节点的前驱总比该节点小,后继总比该节点大。

注:该题我只实现非递归版本的解法

代码实现

struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};

/************************************
一、非递归版本
1、按照中序遍历的原则将二叉树中的结点压栈,利用栈后进先出的特性先把最小的结点出栈
依次从小到大出栈,然后将每个结点的指向左孩子的指针改为指向前一个结点的指针,将
每个结点的指向右孩子的指针改为指向后一个结点的指针即可
*************************************/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == NULL)
return pRootOfTree;
//始终指向此刻遍历到的数字中最大的那个数
TreeNode *pMaxInCurList;
TreeNode *temp = pRootOfTree;
stack<TreeNode *> NodeSt;

while(temp || !NodeSt.empty())
{
while(temp)
{
NodeSt.push(temp);
temp = temp->left;
}

temp = NodeSt.top();
NodeSt.pop();

if(pMaxInCurList == NULL)
{
pMaxInCurList = temp;
pRootOfTree = pMaxInCurList;
}
else
{
temp->left = pMaxInCurList;
pMaxInCurList->right = temp;
pMaxInCurList = temp;
}
temp = temp->right;
}
return pRootOfTree;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指offer