LeetCode二叉树算法——114. 二叉树展开为链表(原地算法)

题目描述:
在这里插入图片描述
这里主要记录一下什么是原地算法:

开始我以为原地算法必需是指空间复杂度为1

但实际上

原地算法:是直接在原来的节点上改变指向,返回值为void,空间复杂度并没有要求

这题解法很多,我看到题目马上就想到就是比较暴力的解法:

非递归先序遍历二叉树,将结点存在集合中,在遍历集合,令其左子树为空,右子树为下一个元素

代码如下:

	/**
     * 原地算法:是直接在原来的节点上改变指向,返回值为void,空间复杂度并没有要求,
     */
    public void flatten(TreeNode root) {
        if (root == null) {
            return;
        }
        Stack<TreeNode> nodes = new Stack<>();
        List<TreeNode> list = new ArrayList<>();
        nodes.add(root);
        while (!nodes.empty()) {
            TreeNode pop = nodes.pop();
            list.add(pop);
            if (pop.right != null) {
                nodes.push(pop.right);
            }
            if (pop.left != null) {
                nodes.push(pop.left);
            }
        }
        for (int i = 0, size = list.size(); i < size; i++) {
            if (i < size - 1) {
                list.get(i).right = list.get(i + 1);
            }
            list.get(i).left = null;
        }
        // 因为是原地算法,所以这里需要赋值给原指针,root
        root = list.get(0);
    }

然后看到别的大神还有其他优秀的解法,不禁感叹,我还是太菜了哈…

其实基本上二叉树的算法题,都是 “遍历二叉树” 的变形,然后需要确认的就是采用递归还是非递归方法,最后结合相应题目要求应该就可以得出答案

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值