题目描述:
标签:栈 树 深度优先搜索 二叉搜索树 链表 二叉树 双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
代码:
思路分析:实际上就是想把一个节点的左子结点指针和右子结点指针改变成前驱结点指针和后继结点指针。
1、首先知道一个性质:中序遍历二叉搜索树得到的是递增序列。所以采用中序遍历递归。
2、中序遍历具体实现步骤:
①首先定义全局变量pre和head用来表示前驱结点和链表的表头。
②递归结束条件,如果当前结点为null,则返回
③先递归左子结点
④处理:如果当前pre为空,说明是链表头部head = node;如果当前pre不为空,说明要进行node.left = pre和pre.right = node的操作,完成后使pre = node
⑤递归右子结点
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val,Node _left,Node _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
Node pre = null;
Node head = null;
public Node treeToDoublyList(Node root) {
if(root == null){
return null;
}
inorder(root);
head.left = pre;
pre.right = head;
return head;
}
public void inorder(Node node){
if(node == null){
return;
}
inorder(node.left);
node.left = pre;
if(pre != null){
pre.right = node;
}
pre = node;
if(head == null){
head = node;
}
inorder(node.right);
}
}