思路:
-
明确Convert函数的功能。
输入:输入一个二叉搜索树的根节点。
过程:将其转化为一个有序的双向链表。
输出:返回该链表的头节点。 -
明确成员变量pLast的功能。
pLast用于记录当前链表的末尾节点。 -
明确递归过程。
递归的过程就相当于按照中序遍历,将整个树分解成了无数的小树,然后将他们分别转化成了一小段一小段的双向链表。再利用pLast记录总的链表的末尾,然后将这些小段链表一个接一个地加到末尾。
/**
* 已排链表的最后一个结点
*/
private TreeNode lastNode=null;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree==null){
return null;
}
//获取其左子树双向链表的头结点
TreeNode head = Convert(pRootOfTree.left);
// 如果左子树为空,那么根节点root为此时双向链表的头节点
if (head==null){
head=pRootOfTree;
}
//连接当前结点和之前的链表
pRootOfTree.left=lastNode;
if (lastNode!=null) {
lastNode.right=pRootOfTree;
}
//更新最后一个结点
lastNode=pRootOfTree;
//安排右节点
Convert(pRootOfTree.right);
return head;
}










网友评论