给你二叉树的根节点 root
,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)(出自力扣)
这个昨天的二叉树的层序遍历有所不同:需要将从后往前层序遍历二叉树,其实很简单,只需要用vector的逆置函数,将vector中的vector逆置即可。
这里顺便理一下昨天这道题的思路;首先使用队列层序遍历二叉树,在此基础上利用队列的大小和一个内循环控制队列出数据到一个一维的vector中。最后将每次的一维vector尾插到二维的vector中。
链接:https://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5?
来源:牛客网
数据范围:输入二叉树的节点数 0≤n≤10000 \le n \le 10000≤n≤1000,二叉树中每个节点的值 0≤val≤10000\le val \le 10000≤val≤1000
要求:空间复杂度O(1)O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)O(n)
题目分析:将二叉搜索树转化为一个排序的双向链表,因为二叉搜索树的中序遍历输出就是一个升序的排序结果,于是可以将前一个结点保留,用前一个结点的right链接当前节点,当前结点的left链接前一个结点,那么就可以用递归的思路搞定他,
1:首先为了方便递归,需在主函数里将前一个结点传给子函数,使子函数可以递归下去。
2:先将prev结点置为空,因为双向链表的头节点的prev指向空,因为是中序遍历所以在子函数中先递归此结点的左子树,然后对此节点进行操作,若prev不为空,就让prev的right指向此结点,再让此结点的left指向prev,当进入下一个节点时此时的root就会变为下一个节点的prev所以不用考虑,此结点与下一个结点的连接问题,
3:递归完成后返回最初的根节点,但这个根节点不是双向链表的头节点,所以要让此结点向左子树迭代直到找到头结点返回头结点为止,
其中需要注意的是在prev的传参过程中虽然他是指针但是也需要传引用,因为每次改变的时这个指针变量中存·的地址,而不是prev中地址的指向,所以可以理解为传的是形参,而形参在递归过程中的改变随着递归的返回也会消失,所以prev在此时需要传引用或者二级指针。
标签:结点,遍历,17,层序,vector,二叉树,prev,节点 From: https://www.cnblogs.com/qjwxlj/p/17327632.html