题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
问题分析:
在二叉树中,每个节点都有两个指向子节点的指针;同样,在双向链表中,每个节点也有两个指针。这两种数据结构相似,是有可能实现二叉搜索树与双向链表的转化的。
在搜索二叉树中,左子节点总是小于父节点的,右子节点总是大于父节点的,因此在转换的时候,原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点指针。所以,我们就有了解题思路。
把根节点与左右子树分开,找到左子树最大的节点pleft,pleft.right指向根节点root,root.left指向pleft;找到右子树最小的节点pright,pright.left指向root,root.right指向pright;然后左子树与右子树的处理方法与上面一样,对其进行递归。
参考代码如下:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class TreeNodeConvertList {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
pRootOfTree=ConvertTreeNode(pRootOfTree);
while( pRootOfTree.left!=null)
pRootOfTree=pRootOfTree.left;
return pRootOfTree;
}
public TreeNode ConvertTreeNode(TreeNode root){
if(root==null)
return null;
if(root.left!=null){
TreeNode left=ConvertTreeNode(root.left);
//找到左子树中最大的节点,然后与root根节点连接
while(left.right!=null)
left=left.right;
left.right=root;
root.left=left;
}
if(root.right!=null){
TreeNode right=ConvertTreeNode(root.right);
//找到右子树中最小的节点,然后与root根节点连接
while(right.left!=null)
right=right.left;
right.left=root;
root.right=right;
}
return root;
}
}