看到题目就感觉要用中序遍历,因为二叉搜索树中序遍历序列是从小到大的有序序列,但是不晓得怎么样才能在遍历到某个结点的时候把它的left指向前驱节点,right指向后继结点,看了大佬题解才知道,可以引入两个Node引用pre和head,分别用于记录前驱节点值和头节点值,每次遍历到某一个结点的时候,把这个结点值left指向pre,然后pre的right指向当前结点,这样就做到了当前结点的left指向前驱节点,上一个结点的right指向当前结点,具体Java代码如下:
/*
// 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,head;
public Node treeToDoublyList(Node root) {
if(root==null) return null;
midTraverse(root);
head.left=pre;
pre.right=head;
return head;
}
public void midTraverse(Node root){
if(root==null) return;
midTraverse(root.left);
if(pre!=null) pre.right=root;
else head=root;
root.left=pre;
pre=root;
midTraverse(root.right);
}
}