题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
中序遍历即可。只需要记录一个pre指针即可。pre和p一直后移操作。
pre是p的先序节点,让pre的next指向p,p的front指向pre(代码中的root就是p)
找到重新生成的链表的头节点,即中序遍历的第一个节点。中序遍历的第一个节点一定是最左下的节点。当pRootOfTree有左子树的时候,pRootOfTree=pRootOfTree.left,再判断pRootOfTree有没有左子树,就不停的找左子树,找到一个点没有左子树,那他就是中序遍历的第一个节点,就是答案的头节点。
代码
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
//pre->p
let pre = null;
function Convert(pRootOfTree)
{
pre = null;
//如果根节点为空返回空就好
if(pRootOfTree == null) return null;
//中序遍历即可。只需要记录一个pre指针即可。
inOrder(pRootOfTree);
//找中序遍历的第一个节点为答案的头节点,中序遍历第一个节点是最坐下的节点,当pRootOfTree有左子树的时候,就不停的找左子树
while(pRootOfTree && pRootOfTree.left){
pRootOfTree = pRootOfTree.left;
}
return pRootOfTree;
}
function inOrder(root){
if(root ==null) return;
inOrder(root.left);
//pre是root的先序节点,让pre的next指向root,root的front指向pre
root.left = pre;
if(pre!=null){
pre.right = root;
}
//pre指针后移
pre = root;
inOrder(root.right);
}
运行环境:Javascript_V8
运行时间:10ms
占用内存:5292KB