题目:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
结合二叉搜索树的性质,其中序遍历的顺序就是最终的有序序列。所以考虑中序遍历这棵树,最终要返回双向链表的首节点,即二叉搜索树左子树的最左边孩子。因此,设置一个记录此左孩子节点的指针。
Java
利用栈实现非递归中序遍历
package nowcoder;
import java.util.Stack;
public class S26_Convert {
public TreeNode Convert(TreeNode pRootOfTree){
if (pRootOfTree == null) return null;
TreeNode p = pRootOfTree;
TreeNode pre = null;
Stack<TreeNode> stack = new Stack<TreeNode>();
boolean isFirst = true;
while (p != null || !stack.isEmpty()){
while (p != null){
stack.push(p);
p = p.left;
}
p = stack.pop(); //出栈
if (isFirst){
pRootOfTree = p;
pre = p;
isFirst = false;
}
else {
p.left = pre;
pre.right = p;
pre = p;
}
p = p.right;
}
return pRootOfTree;
}
}
Python
递归中序遍历
class Convert:
def convert(self, pRootHead):
if not pRootHead:
return None
if not pRootHead.left and not pRootHead.right:
return pRootHead
#左子树构建双向链表
left = self.convert(pRootHead.left)
p = left
#找到左子树的最后一个节点
while p and p.right:
p = p.right
if left:
pRootHead.left = p
p.right = pRootHead
right = self.convert(pRootHead.right)
if right:
pRootHead.right = right
right.left = pRootHead
if left:
return left
else: return pRootHead