• 二叉搜索树和双向链表


    题目描述

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
     
    //二叉搜索树转换成双向链表.
     //二叉树当前结点的左指针应指向该结点左子树中最右孩子的结点;同时最右孩子的右指针应指向当前结点;
     //二叉树当前结点的右指针应指向该结点右子树中最左孩子的结点;同时最左孩子的左指针应指向当前结点;
     public TreeNode Convert(TreeNode pRootOfTree) {
         if(pRootOfTree==null)
            return null;
         if(pRootOfTree.left==null&&pRootOfTree.right==null)
            return pRootOfTree;
         TreeNode head=null;
         if(pRootOfTree.left!=null)
         {  
             TreeNode left= Convert(pRootOfTree.left);            
             TreeNode tmp=left;             
             while(tmp.right!=null)       
                 tmp=tmp.right;      
             tmp.right=pRootOfTree;   
             pRootOfTree.left=tmp;
        }
     
        if(pRootOfTree.right!=null)
        {
            TreeNode right=Convert(pRootOfTree.right);
            TreeNode tmp=right;
            while(tmp.left!=null)
                tmp=tmp.left;
            tmp.left=pRootOfTree;
            pRootOfTree.right=tmp;
         
        }
        //返回链表的头指针
         while(pRootOfTree.left!=null)
             pRootOfTree=pRootOfTree.left;
        return pRootOfTree;
    }
    

      

    class Solution {
    public:
        TreeNode* Convert(TreeNode* pRootOfTree)
        {
            //若不存在,直接返回空指针
            if(!pRootOfTree)
                return nullptr;
            //left代表左子树的最左指针,right代表右子树的最右指针
            TreeNode *left = nullptr, *right = nullptr;
            //若左子树存在,求左子树最左边的指针
            if(pRootOfTree->left)
                left = Convert(pRootOfTree->left);
            //若右子树存在,求右子树的最左边的指针
            if(pRootOfTree->right)
                right = Convert(pRootOfTree->right);
            //先假定最终双向链表的头指针为当前根节点指针
            TreeNode *newRoot = pRootOfTree;
            //若左子树的最左边指针存在,left就是newRoot,进行链接
            if(left)
            {
                newRoot = left;
                while(left->right)
                    left = left->right;
                left->right = pRootOfTree;
                pRootOfTree->left = left;
            }
            //无论右子树最右指针存不存在,都将当前指针指向右子树最右指针
            pRootOfTree->right = right;
           //若右子树最左的指针存在,则进行链接操作
            if(right)
                right->left = pRootOfTree;
            //返回新双向链表的头节点
            return newRoot;
        }
    };
    

      

    /*
    struct TreeNode {
    	int val;
    	struct TreeNode *left;
    	struct TreeNode *right;
    	TreeNode(int x) :
    			val(x), left(NULL), right(NULL) {
    	}
    };*/
    class Solution {
    public:
        TreeNode* Convert(TreeNode* pRootOfTree)
        {
            if(pRootOfTree == NULL)	return NULL;
            TreeNode *pre=NULL;
            convertHelper(pRootOfTree,pre);
            TreeNode * res=pRootOfTree;
            while(res->left)
            	res=res->left;
            return res;
            
        }
        
     	void convertHelper(TreeNode * cur,TreeNode*& pre) {
            if(cur==NULL)	return;
            convertHelper(cur->left,pre);
            cur->left = pre;
            if(pre)	pre->right=cur;
            pre=cur;
            convertHelper(cur->right,pre);
        }
    };
    

      

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    实验 3:Mininet 实验——测量路径的损耗率
    福州大学软件工程实践个人编程作业
    实验 2:Mininet 实验——拓扑的命令脚本生成
    初识MinIO
    基础《Go学习笔记》读书笔记——函数
    Linux配置Golang 依赖包安装
    《Linux shell 脚本攻略》第1章——读书笔记
    vscode连接云服务,搭建Python远程开发
    Python多线程
    Python多进程
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7308921.html
Copyright © 2020-2023  润新知