题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
思路:没有思路
学到的内容
1)二叉搜索树:前序遍历(中序)结果是递增的!
2)循环链表:节点都是双向可达的,记录前后节点;并且头指尾,尾指头!
3)注意二叉树的前中后序遍历查找!
代码:
class Solution {
//创建一个前置节点,不停移动记录,一个头节点记录链表
Node pre,head;
public Node treeToDoublyList(Node root) {
//左指向小,右指向大。作为前驱和后继节点
//进入的位置不确定大小
if(root == null) return null;
//主要的逻辑实现
dfs(root);
//两端特殊的处理
head.left = pre;//此时的pre已经走到了最后一个节点
pre.right = head;
return head;
}
//让之前节点的右
void dfs(Node root){
if(root == null) return;
//这一步就进到了最里面,最左边的值
dfs(root.left);
//如果前一个节点不为空,就将左节点指向当前的节点
if(pre != null) pre.right = root;
//如果前一个节点为空,就需要一个头节点,记录链表
else head = root;
root.left = pre;
//往后移动
pre = root;
dfs(root.right);
}
/*
前序遍历
void dfs(Node node){
if(root == null) return;
dfs(node.left);
System.out.println(node.val);
dfs(node.right);
}
*/
}