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);
        }
    };
    

      

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    Oracle 11G单机 无网络环境静默安装
    Centos 7 编译安装llvm 8.0.0
    linux下测试读写
    Linux 初始化 init 系统(1):sysvinit
    自动挂载文件/etc/fstab功能详解
    虚拟机安装LINUX网络配置注意的问题
    rhel7报错整理
    16/4/4二代支付硬盘故障处理
    RedHat Enterprise Linux 7关闭防火墙方法
    Linux命令之awk数组使用范例
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7308921.html
Copyright © 2011-2022 走看看