数据结构你真的稳了嘛

53 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

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

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/fl… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 示例:

image.png

输入: root = [1,2,5,3,4,null,6]

输出: [1,null,2,null,3,null,4,null,5,null,6]

二、思路分析:

咋一看这题好像挺简单的,考察树的话无疑就是前中后遍历加个层次遍历基本可以解决很多的问题,题目也是说了结果是其前序遍历,但是一动手才发现给这个前序遍历给坑了,其实我们用后序遍历是最简单的分为以下几步:

  • 先把左子树变成链表
  • 把右子树变成链表
  • 这里要把右子树保存到临时变量中,应为下面要开始改当前节点的右子树了
  • 把左子树接到当前节点的右边
  • 把左子树置空
  • 找到当前节点的最右边
  • 把刚才保存的右子树接在上一步的最右边即可

三、AC 代码:

代码一:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {void} Do not return anything, modify root in-place instead.
 */
var flatten = function(root) {
    if(!root)return;
    flatten(root.right);
    flatten(root.left);
    let tem=root.right;
    root.right=root.left;
    root.left=null;
    while(root.right){
        root=root.right;
    }
    root.right=tem;
};

四、总结:

树的题目无疑就是遍历考察,需要注意的就是遍历的先后了。