二叉搜索树与双向链表
** 题目描述**
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
** 解题思路 **
先明确二叉搜索树的性质:父节点的值大于其左孩子的值,小于其右孩子,中序遍历二叉搜索树可以得到一个非递减的有序序列。由此可以知道,将一个树中的节点转换为链表时,其前序节点可能为:
- 左子树
- 左子树的右子树
其后续节点可能为:
- 右子树
- 右子树的左子树
** 代码实现**
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
Tree2List(pRootOfTree);// 调整至双联表结构
TreeNode listHead = pRootOfTree;
for (;listHead.left != null; listHead = listHead.left);
return listHead;
}
public void Tree2List(TreeNode p) {
if (p == null) {
return;
}
if (p.left == null && p.right == null) {// 若为叶子节点
return;
}
else {//非叶子节点
if (p.left != null) {// 有左子树
Tree2List(p.left);
if(p.left.right == null){ // 其左子树无右子树
p.left.right = p;
}
else { // 其左子树有右子树
TreeNode q = p.left;
p.left = q.right;
q.right.right = p;
}
}
if (p.right != null) { //若有右子树
Tree2List(p.right);
if(p.right.left == null) { //若其右子树无左子树
p.right.left = p;
}
else { //若其右子树有左子树
TreeNode q = p.right;
p.right = q.left;
q.left.left = p;
}
}
}
}