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

    题目描述

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
     
    //二叉搜索树转换成双向链表.
     //二叉树当前结点的左指针应指向该结点左子树中最右孩子的结点;同时最右孩子的右指针应指向当前结点;
     //二叉树当前结点的右指针应指向该结点右子树中最左孩子的结点;同时最左孩子的左指针应指向当前结点;
     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);
        }
    };
    

      

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7308921.html
Copyright © 2011-2022 走看看