zoukankan      html  css  js  c++  java
  • 【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) {
        }
    };*/
    /*
    中序遍历迭代法
    */
     
     
  • 相关阅读:
    算法浅谈——一文讲透三分算法
    机器学习基础——一文讲懂中文分词算法
    线性代数精华2——逆矩阵的推导过程
    LeetCode 2 Add Two Numbers——用链表模拟加法
    LeetCode 1 Two Sum——在数组上遍历出花样
    大数据基石——Hadoop与MapReduce
    Flexbox布局
    对象基础
    对象枚举属性
    我的第一篇博文
  • 原文地址:https://www.cnblogs.com/wikiwen/p/10225842.html
Copyright © 2011-2022 走看看