二叉搜索树的概念:
对于树上任意节点,满足左子树中所有节点的值都小于根节点的值,根节点对应的值都小于右子树中所有节点对应的值;
二叉搜索树的中序遍历是有序的;
题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何
新结点,只能调整树中结点指针的指向。
思路:
- 判断当前二叉搜索树是否为空树,空树直接返回null;
- 判断当前二叉搜索树是否为叶子节点,是则直接返回叶子节点;
- 根据二叉搜索树中序遍历是有序的,找到二叉搜索树左子树的尾巴;
- 如果二叉搜索树左子树非空,则将其尾巴节点和根节点拼接起来;
- 如果二叉搜索树右子树非空,则将根节点和右子树拼接起来;
- 最终若二叉搜索树左子树为空,则返回根节点,反之返回左子树对应节点;
代码如下:
class TreeNode{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null){
return null;
}
if (pRootOfTree.left == null && pRootOfTree.right == null){
return pRootOfTree;
}
TreeNode left = Convert(pRootOfTree.left);
TreeNode leftTail = left;
//找到左子树的尾巴节点
while (left != null && leftTail.right != null){
leftTail = leftTail.right;
}
//如果左子树非空,则将左子树的尾巴节点和根节点拼接起来
if (left != null){
leftTail.right = pRootOfTree;
pRootOfTree.left = leftTail;
}
TreeNode right = Convert(pRootOfTree.right);
//如果右子树非空,则将根节点和右子树拼接起来
if (right != null){
pRootOfTree.right = right;
right.left = pRootOfTree;
}
return (left==null)?pRootOfTree:left;
}
}