二叉搜索树的中序遍历是有序的,因此通过中序遍历来递归二叉树。
flatten方法:
- 按照中序遍历的顺序,先递归处理左子树。
- 处理当前节点,将其连接到双向链表中。
- 如果 tail 不为 null,说明已经有节点在链表中,此时将当前节点的左指针指向 tail,tail 的右指针指向当前节点。
- 如果 tail 为 null,说明找到最左侧的节点,即最小值为头节点,将head指向当前节点。
- 更新 tail 为当前节点。
- 最后递归处理右子树。
import java.util.*;
public class Solution {
// 用于记录双向链表的头节点
public TreeNode head = null;
// 用于记录双向链表的尾节点
public TreeNode tail = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
// 进行中序遍历并构建双向链表
flatten(pRootOfTree);
return head;
}
// 中序遍历二叉树并构建双向链表
public void flatten(TreeNode cur) {
if (cur == null) {
return;
}
// 递归处理左子树
flatten(cur.left);
// 处理当前节点,将其连接到双向链表中
if (tail != null) {
// 当前节点的左指针指向前驱(即tail)
cur.left = tail;
// 前驱的右指针指向当前节点
tail.right = cur;
} else {
// 找到最左侧的节点,即最小值为头节点
head = cur;
}
// 更新尾节点为当前节点
tail = cur;
// 递归处理右子树
flatten(cur.right);
}
}

京公网安备 11010502036488号