LeetCode99-20.8.8-恢复二叉搜索树

题目链接LeetCode99
分析:看了题解做的,一开始想遍历树找到不符合的一个节点并在树中再次遍历找另一个,后来发现是一团糟。看了题解之后发现只要利用BST中序遍历是有序的特点就能思路清晰的做。
如题解所说,有三种解法,时间复杂度都是o(n),空间复杂度分别是o(n),o(h),o(1),三者都利用了二叉搜素树中序遍历有序。
第一种是中序遍历出来,找到交换的点的值,然后遍历找交换的点直接赋另外的一个的值。
第二种隐式中序遍历是保存一个中序遍历的前驱的值,手动实现栈和递归的栈原理一样,都是,一直进入到树底部,然后一层层返回的。
在这里插入图片描述
第三种Morris中序遍历是为了节省栈调用的空间,所以把递归返回到父节点的那一层的过程变为用左子树的最右节点来存储父节点的地址。
在这里插入图片描述

如图,黄色的线和绿色的线代表遍历的顺序,红色的线代表和左子树的最右节点(即是中序遍历父节点的前驱)与父节点链接。
当黄色的线到达最右节点时候,红色的线连接。
绿色的线即是树的中序遍历顺序。

1、2、3对比如下:
时间:o(n) 3>1>2
空间:o(n) o(h) o(1) 1>2>3
按道理应该是这样
1.时间:遍历树n,查找数组1~n-1,遍历更新1 ~n-1,
总体o(n)~o(3n)=o(n)
空间:数组空间n,系统栈空间(树高)h
总体o(n)+o(h)=o(n)
2.时间:遍历树n
总体o(n)
空间:手动栈空间h
总体o(h)
3.时间:遍历连左子树最右节点大概n,遍历n
总体o(2n)=o(n)
空间:几个变量
总体o(1)

但是…
我的提交从下到上分别是1,2,3种解法
在这里插入图片描述
内存占用大小是空间复杂度的体现吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值