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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Content delivery network
    散列算法的基础原理 确保资料传递无误
    科学计算 NumPy 与C语言对比 N-dimensional array ndarray 元素元素操作 计算正太分布分位数 ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素
    t
    百度 url 当在baidu搜索结果展示页,去点击标头时
    指定文件夹 指定文件后缀名 删除整个文件夹 git 冲突解决 create a new repository on the command line push an existing repository from the command line rebase
    修改MojoWeixin 只保留用户name 取消群昵称
    AnyEvent::HTTP 介绍
    AnyEvent::HTTP 介绍
    异步和同步http请求超时机制
  • 原文地址:https://www.cnblogs.com/itdef/p/11407420.html
Copyright © 2011-2022 走看看