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

    题目描述

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
     
    解题思路:
    递归回溯维护当前子树的最小值节点、最大值节点组成的pair。如果是左子树,那么应该取最大值节点来与当前节点关联;如果是右子树,取最小值与当前节点关联。同时记录链表的头结点,由于是二叉搜索树,所以只需要找到最小值的节点即可。
    class Solution {
    public:
        //记录所有节点中值最小的节点为链表头结点
        TreeNode *newHead = NULL;
        pair<TreeNode*, TreeNode*> myConvert(TreeNode* root){
            if(root == NULL){
                return make_pair(root, root);
            }
            if(newHead == NULL){
                newHead = root;
            }else{
                //找最小的节点
                newHead = newHead->val > root->val? root: newHead;
            }
            if(root->left == NULL && root->right == NULL){
                return make_pair(root, root);
            }
            //维护子树中的最小值、最大值节点
            pair<TreeNode*, TreeNode*> lret;
            pair<TreeNode*, TreeNode*> rret;
    
            if(root->left != NULL){
                lret =  myConvert(root->left);
                //左子树中最大值节点与当前节点关联
                TreeNode* scd = lret.second;
                root->left = scd;
                scd->right = root;
            }
            if(root->right != NULL){
                rret = myConvert(root->right);
                //右子树中最小值节点与当前节点关联
                TreeNode* fst = rret.first;
                root->right = fst;
                fst->left = root;
            }
            //返回当前子树中最小值节点和最大值节点
            TreeNode* lt = root;
            TreeNode* rt = root;
            if(lret.first != NULL){
                lt = lret.first;
            }
            if(rret.second != NULL){
                rt = rret.second;
            }
            return make_pair(lt, rt);
        }
        TreeNode* Convert(TreeNode* pRootOfTree)
        {
            if(pRootOfTree == NULL){
                return NULL;
            }
            newHead = pRootOfTree;
            pair<TreeNode*, TreeNode*>lret;
            if(pRootOfTree->left != NULL){
                lret = myConvert(pRootOfTree->left);
                TreeNode* scd = lret.second;
                pRootOfTree->left = scd;
                scd->right = pRootOfTree;
            }
            pair<TreeNode*, TreeNode*> rret;
            if(pRootOfTree->right != NULL){
                rret = myConvert(pRootOfTree->right);
                TreeNode* fst = rret.first;
                pRootOfTree->right = fst;
                fst->left = pRootOfTree;
            }
            return newHead;
        }
    };
    

      

  • 相关阅读:
    三角形外接圆与内切圆
    不等式证明
    不等式证明
    被 6 整除
    被 6 整除
    从切比雪夫不等式到大数定理
    JAVA轻量级文件监控
    Windows应用程序的消息处理机制
    JUnit中@Test的运行顺序
    MyReport报表引擎2.2.0.0新功能
  • 原文地址:https://www.cnblogs.com/chengsheng/p/10664354.html
Copyright © 2011-2022 走看看