题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
按照中序遍历的顺序就是排序的顺序。因此只需要在中序遍历中进行指针的改变
用一个公共指针记录已遍历完成的前一个节点
那么只需让当前节点的left指向公共节点,公共节点的right指向当前节点
然后当前节点为公共节点即可
之后就是递归
暴力思路就是用数组存储中序遍历的结果再按结果进行指针的修改,不再赘述
bu***记录:必须分成两个函数与实现。因为涉及到递归,所以会执行多次中序,而最终查找头结点需要在递归完成之后,不然会修改指针的指向
** java代码**
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { private TreeNode node=null;//记录当前遍历的节点 public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null) return null; midorder(pRootOfTree);//在中序遍历中完成对指针的修改 while(pRootOfTree.left!=null && pRootOfTree != null){ //必须先修改完指针,才能按照最后的结果进行头结点的寻找 //原本的根节点位于中间,直接向前寻找即可 pRootOfTree=pRootOfTree.left; } return pRootOfTree; } public void midorder(TreeNode pRootOfTree){//在中序遍历中完成对指针的修改 if(pRootOfTree==null) return ; midorder(pRootOfTree.left); pRootOfTree.left=node; if(node != null){ node.right=pRootOfTree; } node=pRootOfTree; midorder(pRootOfTree.right); } }