leetcode-二叉搜索树与双向链表
题目链接:题目链接
题目大意是有一棵二叉搜索树,给定树的结构,需要将其转化成一个有序的双向链表。
思路还是很明显的,对于一颗二叉搜索树而言,我们只需要对其进行中序遍历,按照左、中、右的顺序读取到数据,他们自然是有序的,但是问题在于将其转化成双向队列的话需要去设置一下每个元素的前驱节点和后继节点,对于第一个节点,它自身就是head,而后面的节点,其前驱节点是前一个结点,其前一个节点的后继是他本身,所以可以这样编码
Node head = null, pre = null;
public Node treeToDoublyList(Node root) {
//特判样例
if(root == null) {
return null;
}
//开始深搜当前节点
dfs(root);
head.left = pre;
pre.right = head;
return head;
}
public void dfs(Node now) {
//空子树,结束递归
if(now == null) {
return ;
}
//遍历左子树
dfs(now.left);
//对于最开始遍历的情况,pre==null时到达了整颗二叉树的最左侧
if(pre != null) {
//中介结点而言,设置一下前驱节点的后继节点
pre.right = now;
}else {
//对于本题目,这个节点就是头节点
head = now;
}
//设置当前节点的前驱节点
now.left = pre;
pre = now;
//遍历右子树
dfs(now.right);
}
}
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;
}
}