给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

这题比较直观的可以想到,先按照先序遍历的顺序,用每个TreeNode构造一个数组,再把数组中每个元素的left设置为null,right设置为下一个元素。

JavaScript代码实现:

/**
 * @param {TreeNode} root
 * @return {void} Do not return anything, modify root in-place instead.
 */
var flatten = function (root) {
    const nodes = [];
    const helper = (node) => {
        if (node) {
            nodes.push(node);
        } else {
            return;
        }
        helper(node.left);
        helper(node.right);
    };
    for (let i = 0; i < nodes.length; i++) {
        const node = nodes[i];
        node.left = null;
        node.right = nodes[i + 1] || null;
    }
};

实现了一版竟然不对,迷了,这什么情况???

原来是每调用helper()...太傻比了

var flatten = function (root) {
    const nodes = [];
    const helper = (node) => {
        if (node) {
            nodes.push(node);
        } else {
            return;
        }
        helper(node.left);
        helper(node.right);
    };
    helper(root);
    for (let i = 0; i < nodes.length; i++) {
        const node = nodes[i];
        node.left = null;
        node.right = nodes[i + 1] || null;
    }
};

上一篇 下一篇