1.把整体问题划分为局部问题,依据中序遍历模式,让每个节点的left指针为prev指针,right指针为next指针。
2.根据推理规律,每个树的根节点的left(prev)为其左孩子的最右节点,right(next)为其右孩子的最左节点。
3.根据规律写出递归代码如下:
public static void binaryTreeToLinkedList(Node root) {
if (root == null)
return;
binaryTreeToLinkedList(root.left);
binaryTreeToLinkedList(root.right);
if (root.left != null) {
Node lchildRighterNode = findRighterNode(root.left); // 左孩子的最右节点
lchildRighterNode.right = root;
root.left = lchildRighterNode;
}
if (root.right != null) {
Node rchildLefterNode = findLefterNode(root.right); // 右孩子的最左节点
root.right = rchildLefterNode;
rchildLefterNode.left = root;
}
}
static Node findRighterNode(Node node) {
while (node.right != null) {
node = node.right;
}
return node;
}
static Node findLefterNode(Node node) {
while (node.left != null) {
node = node.left;
}
return node;
}