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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    CentOS安装配置
    扩展多线程应用程序 CLR 和 线程
    OEA体验 :元数据编写
    字符串的逆序之旅
    学习之响应式Web设计:Media Queries和Viewports
    Windows Azure Virtual Machine Role (4) 在VHD中安装需要的功能
    java开发web service快速入门(视频)
    淘宝技术发展(Java时代:脱胎换骨)
    Contoso 大学 使用 EF Code First 创建 MVC 应用
    负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念网络基础
  • 原文地址:https://www.cnblogs.com/itdef/p/11407420.html
Copyright © 2011-2022 走看看