zoukankan      html  css  js  c++  java
  • acwing 49. 二叉搜索树与双向链表

    地址:https://www.acwing.com/problem/content/87/

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。

    要求不能创建任何新的结点,只能调整树中结点指针的指向。

    注意:

    • 需要返回双向链表最左侧的节点。

    例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。

    解法

    树的处理 一半都是递归  分为 根  树的左子树 和树的右子树

    子树也是一棵树 进行递归处理  向上返回一个双链表  返回链表的头尾

    最后全部转化链表

    代码

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        
        TreeNode* rethead = NULL;
    
        TreeNode* gleft = NULL;
        TreeNode* gright = NULL;
        
        
        void convertInner(TreeNode* root)
        {
            if (NULL == root) return;
        
            if (root->val < rethead->val) rethead = root;
        
            if (root->left == NULL && root->right == NULL) {
                gleft = root; gright = root;
                return;
            }
            else if (root->left != NULL && root->right == NULL) {
                convertInner(root->left);
                gright->right = root;
                root->left = gright;
                gright = root;
            }
            else if (root->right != NULL && root->left == NULL) {
                convertInner(root->right);
                gleft->left = root;
                root->right = gleft;
                gleft = root;
            }
            else if (root->right != NULL && root->left != NULL) {
                convertInner(root->left);
                gright->right = root;
                root->left = gright;
                
                TreeNode* leftcopy = gleft;
        
                convertInner(root->right);
                gleft->left = root;
                root->right = gleft;
                gleft = leftcopy;
            }
        }
        
        
        
        TreeNode* convert(TreeNode* root) {
            if (NULL == root) return NULL;
            rethead = root;
        
            if (root->left == NULL && root->right == NULL) return root;
        
            if (root->left != NULL && root->right == NULL) {
                convertInner(root->left);
                gright->right = root;
                root->left = gright;
            }
            else if (root->right != NULL && root->left == NULL) {
                convertInner(root->right);
                gleft->left = root;
                root->right = gleft;
            }
            else if (root->right != NULL && root->left != NULL) {
                convertInner(root->left);
                gright->right = root;
                root->left = gright;
        
                convertInner(root->right);
                gleft->left = root;
                root->right = gleft;
            }
        
            return rethead;
        }
        
    };
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        
        TreeNode* rethead = NULL;
    
        TreeNode* gleft = NULL;
        TreeNode* gright = NULL;
        
        
        void convertInner(TreeNode* root)
        {
            if (NULL == root) return;
        
            if (root->val < rethead->val) rethead = root;
        
            if (root->left == NULL && root->right == NULL) {
                gleft = root; gright = root;
                return;
            }
            else if (root->left != NULL && root->right == NULL) {
                convertInner(root->left);
                gright->right = root;
                root->left = gright;
                gright = root;
            }
            else if (root->right != NULL && root->left == NULL) {
                convertInner(root->right);
                gleft->left = root;
                root->right = gleft;
                gleft = root;
            }
            else if (root->right != NULL && root->left != NULL) {
                convertInner(root->left);
                gright->right = root;
                root->left = gright;
                
                TreeNode* leftcopy = gleft;
        
                convertInner(root->right);
                gleft->left = root;
                root->right = gleft;
                gleft = leftcopy;
            }
        }
        
        
        
        TreeNode* convert(TreeNode* root) {
            if (NULL == root) return NULL;
            rethead = root;
        
            if (root->left == NULL && root->right == NULL) return root;
        
            if (root->left != NULL && root->right == NULL) {
                convertInner(root->left);
                gright->right = root;
                root->left = gright;
            }
            else if (root->right != NULL && root->left == NULL) {
                convertInner(root->right);
                gleft->left = root;
                root->right = gleft;
            }
            else if (root->right != NULL && root->left != NULL) {
                convertInner(root->left);
                gright->right = root;
                root->left = gright;
        
                convertInner(root->right);
                gleft->left = root;
                root->right = gleft;
            }
        
            return rethead;
        }
        
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Codeforces Round #678 (Div. 2)
    #Dijkstra#洛谷 4943 密室
    #线性基,点分治#洛谷 3292 [SCOI2016]幸运数字
    #线性基#LOJ 114 k大异或和
    #2-SAT,Tarjan,前缀优化建边#洛谷 6378 [PA2010]Riddle
    #树形dp,二次扫描换根法#洛谷 4284 [SHOI2014]概率充电器
    #dp#洛谷 5774 [JSOI2016]病毒感染
    #Tarjan,拓扑排序#洛谷 3436 [POI2006]PRO-Professor Szu
    #差分约束,Floyd#洛谷 2474 [SCOI2008]天平
    #Tarjan,SPFA,差分约束系统#BZOJ 2330 AcWing 368 银河
  • 原文地址:https://www.cnblogs.com/itdef/p/11407420.html
Copyright © 2011-2022 走看看