首页 > 其他分享 >面试必刷TOP101:30、 二叉搜索树与双向链表

面试必刷TOP101:30、 二叉搜索树与双向链表

时间:2023-11-19 23:32:26浏览次数:33  
标签:right 30 链表 必刷 null root 节点 left

题目

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

面试必刷TOP101:30、 二叉搜索树与双向链表_子树

面试必刷TOP101:30、 二叉搜索树与双向链表_双链表_02

题解

方法一:非递归版
解题思路:
1.核心是中序遍历的非递归算法。
2.修改当前遍历节点与前一遍历节点的指针指向。
    import java.util.Stack;
    public TreeNode ConvertBSTToBiList(TreeNode root) {
    	if(root==null)
    		return null;
    	Stack<TreeNode> stack = new Stack<TreeNode>();
    	TreeNode p = root;
    	TreeNode pre = null;// 用于保存中序遍历序列的上一节点
    	boolean isFirst = true;
    	while(p!=null||!stack.isEmpty()){
    		while(p!=null){
    			stack.push(p);
    			p = p.left;
    		}
    		p = stack.pop();
    		if(isFirst){
    			root = p;// 将中序遍历序列中的第一个节点记为root
    			pre = root;
    			isFirst = false;
    		}else{
    			pre.right = p;
    			p.left = pre;
    			pre = p;
    		}		
    		p = p.right;
    	}
    	return root;
    }
方法二:递归版
解题思路:
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。
    public TreeNode Convert(TreeNode root) {
    	if(root==null)
    		return null;
    	if(root.left==null&&root.right==null)
    		return root;
    	// 1.将左子树构造成双链表,并返回链表头节点
    	TreeNode left = Convert(root.left);
    	TreeNode p = left;
    	// 2.定位至左子树双链表最后一个节点
    	while(p!=null&&p.right!=null){
    		p = p.right;
    	}
    	// 3.如果左子树链表不为空的话,将当前root追加到左子树链表
    	if(left!=null){
    		p.right = root;
    		root.left = p;
    	}
    	// 4.将右子树构造成双链表,并返回链表头节点
    	TreeNode right = Convert(root.right);
    	// 5.如果右子树链表不为空的话,将该链表追加到root节点之后
    	if(right!=null){
    		right.left = root;
    		root.right = right;
    	}
		return left!=null?left:root;        
    }
方法三:改进递归版
解题思路:
思路与方法二中的递归版一致,仅对第2点中的定位作了修改,新增一个全局变量记录左子树的最后一个节点。
    // 记录子树链表的最后一个节点,终结点只可能为只含左子树的非叶节点与叶节点
    protected TreeNode leftLast = null;
    public TreeNode Convert(TreeNode root) {
    	if(root==null)
    		return null;
    	if(root.left==null&&root.right==null){
    		leftLast = root;// 最后的一个节点可能为最右侧的叶节点
    		return root;
    	}
    	// 1.将左子树构造成双链表,并返回链表头节点
    	TreeNode left = Convert(root.left);
    	// 3.如果左子树链表不为空的话,将当前root追加到左子树链表
    	if(left!=null){
    		leftLast.right = root;
    		root.left = leftLast;
    	}
    	leftLast = root;// 当根节点只含左子树时,则该根节点为最后一个节点
    	// 4.将右子树构造成双链表,并返回链表头节点
    	TreeNode right = Convert(root.right);
    	// 5.如果右子树链表不为空的话,将该链表追加到root节点之后
    	if(right!=null){
    		right.left = root;
    		root.right = right;
    	}
		return left!=null?left:root;        
    }

标签:right,30,链表,必刷,null,root,节点,left
From: https://blog.51cto.com/u_16244372/8476048

相关文章

  • vue前端项目启动报错:error:0308010C:digital envelope routines::unsupported
    问题描述使用 npmrundev 或者 yarnrundev 时报错:error:0308010C:digitalenveloperoutines::unsupported解决方案修改package.json,在相关构建命令之前加入setNODE_OPTIONS=--openssl-legacy-provider"scripts":{"dev":"setNODE_OPTIONS=--openssl-legacy-provide......
  • 2023-2024-1 20231305 《计算机基础与程序设计》第八周学习总结
    2023-2024-120231305《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<写上具体方面>......
  • 基于mdev实现adb热插拔(@STM32MP157D+fusb302)
    关键词:fusb302、uevent、mdev、adbd等等。1fusb302关于USB插拔检测,以及增加uevent事件fsusb302支持USBPowerDelivery协议(USBPowerDelivery),支持识别各种USB设备和对应的状态。fusb302支持DRP(DualRolePower)、DFP(DownstreamFacingPort)、UFP(UpstreamFacingPort)......
  • 2023-2024-1 20231303 《计算机基础与程序设计》赵泊瑄第八周学习总结
    2023-2024-120231303《计算机基础与程序设计》赵泊瑄第八周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里作业要求的链接2023-2024-1计算机基础与程序设计第八周作业)这个作业的目标总结第八周学习收获作业正文......
  • (链表)18-随机链表的复制
    1/*2classNode{3intval;4Nodenext;5Noderandom;67publicNode(intval){8this.val=val;9this.next=null;10this.random=null;11}12}13*/1415classSolution{16public......
  • 2023-2024-1 20231306 《计算机基础与程序设计》第八周学习总结
    这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第八周作业这个作业的目标功能设计与面向对象设计、面向对象设计过程、面向对象语言三要素、汇编、编译、解释、执行作业正文https://www.cnblogs.com/......
  • (链表)17-两两交换链表中的节点
    1/**2*Definitionforsingly-linkedlist.3*publicclassListNode{4*intval;5*ListNodenext;6*ListNode(){}7*ListNode(intval){this.val=val;}8*ListNode(intval,ListNodenext){this.val=val;......
  • (链表)08-链表中倒数最后K个结点
    1importjava.util.*;23/*4*publicclassListNode{5*intval;6*ListNodenext=null;7*publicListNode(intval){8*this.val=val;9*}10*}11*/1213publicclassSolution{14/**15*@param......
  • 2023-2024-1 20231304 《计算机基础与程序设计》第八周学习总结
    2023-2024-120231304《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第八周作业这个作业的目标功能设计与面向对象设计,面向对象设计过程,面向对象语言......
  • (链表)09-删除链表的倒数第N个节点
    1importjava.util.*;23/*4*publicclassListNode{5*intval;6*ListNodenext=null;7*}8*/9publicclassSolution{10/**11*@paramheadListNode类12*@paramnint整型13*@returnListNode类14......