题目
题目来源:力扣(LeetCode
二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求依然符合二叉搜索树的性质,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。
返回转换后的单向链表的头节点。
注意:本题相对原题稍作改动
示例:
输入: [4,2,5,1,3,null,6,0]
输出: [0,null,1,null,2,null,3,null,4,null,5,null,6]
思路分析
二叉搜索树中序遍历结果为从小到大顺序,每次保存上一次中序遍历的结点,让上一个结点的右子树指向当前结点,并把当前结点左子树置空。
具体地:
- 新建一个节点
- 中序遍历二叉搜索树
- 边遍历边操作一次,改变一次位置
- 操作一次有3个步骤:
- 当前根节点的左节点赋为null;
- 上一个节点的右节点指向当前节点;
- 更新上一个节点,以便下次操作
- 最后返回新建节点的右节点
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
// 1.将当前根节点的左节点 赋值为null;
// 2.上一个节点的右节点指向当前节点
// 3.更新上一个节点,方便我们下一步操作
var convertBiNode = function (root) {
//新建一个节点,作为初始空节点的上一个节点
let preNode = new TreeNode(0);
const res = preNode;
const inOrder = root => {
if (!root) return null;
inOrder(root.left);
// 将当前根节点的左节点 赋值为null;
root.left = null;
// 上一个节点的右节点指向当前节点
preNode.right = root;
// 更新上一个节点,方便我们下一步操作
preNode = root;
inOrder(root.right);
}
inOrder(root);
return res.right;
};