二叉搜索树的中序遍历是有序的,所以可以在中序遍历的基础上进行添加
将中序遍历中的输出结点替换为本题所需要的结点中间的连接(具体看注解)
public class Offer36 {
/** 二叉搜索树的中序遍历是有序的,所以可以在中序遍历的基础上进行添加*/
/** 设立两个辅助指针,一个用来指向当前结点,一个指向上一个结点*/
private Node pre;
private Node head;
public Node treeToDoublyList(Node root) {
if(root == null) return null;
/** 将头结点和最后一个结点进行连接*/
dfs(root);
pre.right = head;
head.left = pre;
return head;
}
/** 定义一个递归函数,*/
public void dfs(Node node){
Node curr = node;
/** 终止条件: 穿过叶子结点*/
if (curr == null) return;
/** 问题与子问题关系: */
dfs(curr.left);
/** 连接思路: 让当前结点curr和上一个结点 pre 相互指向 即 curr.left = pre pre.right = curr
* 因为前序遍历中 pre 小于 curr */
//如果pre为null,说明当前结点为 head结点
if (pre == null) {
head = curr;
}else {
pre.right = curr;
}
curr.left = pre;
pre = curr;
dfs(curr.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;
}
}