【LeetCode & 剑指offer刷题】树题14:36 二叉搜索树与双向链表

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

36 二叉搜索树与双向链表

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
 
 
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
/*
方法一:中序遍历迭代法
参考题目: Validate Binary Search Tree
*/
class Solution
{
public:
    TreeNode* Convert(TreeNode* root)
    {
        if(root == nullptr) return nullptr;
        TreeNode* head = root;
        while(head->left) head = head->left; //二叉搜索树中最左子结点即为中序遍历的第一个结点
       
        stack<TreeNode*> s;
        TreeNode* p = root, *pre = nullptr;
        while(p || !s.empty())
        {
            if(p)
            {
                s.push(p);
                p = p->left;
            }
            else
            {
                p = s.top();
                p->left = pre; //连接ppre
                if(pre) pre->right = p; //连接prep
                pre = p; //更新pre
                s.pop();
               
                p = p->right;
            }
        }
        return head;
    }
};
 
/*
方法二:中序遍历递归法(左、根、右)
*/
class Solution
{
private:
    TreeNode* pre;
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == nullptr) return nullptr;
        pre = nullptr; //初始化成员变量,用于记录上一次访问的结点
        convertNode(pRootOfTree);
       
        TreeNode* head = pRootOfTree;
        while(head->left) head = head->left; //二叉搜索树中最左子结点即为中序遍历的第一个结点
        return head;
    }
private:
    void convertNode(TreeNode* cur)
    {
        if(cur == nullptr) return;
       
        //转换左子树
        convertNode(cur->left);
       
        //转换根结点
        cur->left = pre;
        if(pre) pre->right = cur;
        pre = cur; //记录被处理过的结点
       
        //转换右子树
        convertNode(cur->right);
       
    }
};
 
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
/*
中序遍历迭代法
*/
 
 

 

posted @ 2019-01-05 19:49  wikiwen  阅读(283)  评论(0编辑  收藏  举报