426. 将二叉搜索树转化为排序的双向链表


426. 将二叉搜索树转化为排序的双向链表

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。

对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/convert-binary-search-tree-to-sorted-doubly-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一、二叉树递归套路

X为头的整棵二叉树请变成有序双向链表返回info信息
info信息两个:转完之后的链表的头指针,和转完之后链表的尾指针而且只返回两个变量,
但是我认为中间全部串好了。
在这里插入图片描述

我们调用f(4)的时候,有f(2)和f(6),将f(2)和f(6)的首尾相连
调用f(2)的时候有f(1)和f(3),将f(1)和f(3)首尾相连
调用f(6)的时候有f(5)和f(7),将f(5)和f(7)首尾相连

代码

public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int data) {
			this.value = data;
		}
	}

	public static Node treeToDoublyList(Node head) {
		if (head == null) {
			return null;
		}
		Info allInfo = process(head);
		allInfo.end.right = allInfo.start;
		allInfo.start.left = allInfo.end;
		return allInfo.start;
	}

	public static class Info {
		public Node start;
		public Node end;

		public Info(Node start, Node end) {
			this.start = start;
			this.end = end;
		}
	}

	public static Info process(Node X) {
		if (X == null) {
			return new Info(null, null);
		}
		Info lInfo = process(X.left);
		Info rInfo = process(X.right);
		if (lInfo.end != null) {
			lInfo.end.right = X;
		}
		X.left = lInfo.end;
		X.right = rInfo.start;
		if (rInfo.start != null) {
			rInfo.start.left = X;
		}
		// 整体链表的头    lInfo.start != null ? lInfo.start : X
		// 整体链表的尾    rInfo.end != null ? rInfo.end : X
		return new Info(lInfo.start != null ? lInfo.start : X, rInfo.end != null ? rInfo.end : X);
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜菜的变强之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值