「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
给定一棵搜索二叉树头节点,转化成首尾相接的有序双向链表
一、分析
前置知识:二叉树、搜索二叉树、双向链表
二叉树结构:value、left、right
搜索二叉树结构:value、left、right,任何头节点比左边节点大,比右边节点小
双向链表结构:next、pre(last)指针
搜索二叉树:任何头节点,它的左节点比它小,它的右节点比它大
二叉树:L、R 指针
双向链表:next、last(pre)指针
任何头节点,它的左子树形成有序双向链表,它的右子树形成有序双向链表,头节点在中间,整体形成有序双向链表,然后头尾再分别指向,最终就是搜索二叉树转换有序双向链表
x为头的整颗二叉树变成有序链表,返回Info信息有两个,转完之后的头指针(start)、转完之后的尾指针(end),Info信息的尾部的右指针指向Info的头指针,Info信息的头部的左指针指向Info的尾指针,即 allInfo.end.right = allInfo.start,allInfo.start.left = allInfo.end
二、实现
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);
}
三、总结
二叉树递归套路
整体链表的头 lInfo.start != null ? lInfo.start : X
整体链表的尾 rInfo.end != null ? rInfo.end : X