二叉搜索树与双向链表
-
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。(二叉搜索树中,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值)
-
思路:将整棵树分为根节点、左子树、右子树。在把左、右子树都转换成排序的双向链表之后再和根节点链接起来,整棵树就转换成了排序的双向链表。
1.使用一个全局变量指向已经转换好的链表的最后一个节点pLast
2.递归函数,按照中序遍历的思想:先链接左子树,然后把pLast与当前节点链接起来(cur.left=pLast ; pLast.right=cur(先判断pLast是否为null)
),pLast指向当前节点,再链接右子树。
3.由尾结点向前遍历链表得到头节点(while(pLast!=null&&pLast.left!=null)
) -
代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//全局变量记录已经连接好链表的最后一个节点
TreeNode pLast = null;
public TreeNode Convert(TreeNode pRootOfTree) {
convert(pRootOfTree);
//根据尾结点找到链表的头节点
while(pLast!=null&&pLast.left!=null){
pLast = pLast.left;
}
return pLast;
}
public void convert(TreeNode pRoot){
if(pRoot==null){
return ;
}
if(pRoot.left!=null){
convert(pRoot.left);
}
//当前节点的左节点指向pLast
pRoot.left = pLast;
if(pLast!=null){
//pLast的右节点指向当前节点
pLast.right = pRoot;
}
//pLast指向当前节点
pLast = pRoot;
if(pRoot.right!=null){
convert(pRoot.right);
}
}
}