一、题目描述
题目描述:
二、二叉搜索树特点及解题思路
1.每个节点都比它的左节点大,比它的右节点小
2.二叉搜索树的中序遍历是有序的
比如:
该数中序遍历:1345678,然后转换成双向链表,也就是按顺序把各个节点互相连起来,示意图如下:
那么这里很容易发现,left变成了双向链表的前驱,right变成了双向链表的后继,我们在中序遍历的过程中,需要修改每个节点的left和right,最后我们返回节点1即可。
三、代码实战
public class Solution {
TreeNode prev=null;
public void inorder(TreeNode cur){//中序遍历-左根右
if(cur==null){
return ;
}
inorder(cur.left);
//第一次走到这里说明到了最左边的节点
cur.left=prev;
//如果是第一次执行这一行,prev是null,把最左边的左边置为null
//如果不是第一次执行这一行,说明是递归上来的,prev是当前cur的前序
if(prev!=null){
prev.right=cur;
}
prev=cur;
inorder(cur.right);
}
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null){
return null;
}
inorder(pRootOfTree);
//中序遍历完,已经变成了双向链表
TreeNode head=pRootOfTree;//我们这里用pRootOfTree作为链表中的一个元素来找头节点
while(head.left!=null){
head=head.left;
}
//走到这里,head为头节点
return head;
}
}