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

来源:互联网 发布:噪声检测软件哪款好 编辑:程序博客网 时间:2024/06/06 17:54

题目


分析

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

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

代码实现

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;    }};


阅读全文
0 0
原创粉丝点击