首页 > 编程知识 正文

二叉树后序遍历的非递归实现,二叉树遍历图解

时间:2023-05-03 05:36:54 阅读:34408 作者:3774

中序扫描-三种解法

LeetCode94-二叉树的中序遍历

解法3参考公式问题求解

解法1 :递归

基础解法容易想出来,容易写。 时空复杂度均为o(n )

类别解决方案{ public : vectorintinordertraversal (treenode * root ) { vectorint res; 根0 (RES,root ); 返回RES; }voidroot0(vectorintRES,TreeNode* root ) if ) root==nullptr ) return; 根0 (RES,根左); RES.push _ back (根val; 根0 (RES,root-right ); 返回; }; 解法2 :迭代

也是基础解法,实际上和递归一样。 递归操作本质上是隐式维护堆栈的,表示采用迭代,添加并使用堆栈。

编程的想法是在初始化堆栈的同时收集“左”的值,从堆栈追溯到“根”和“右”。

时空复杂度和递归法都是o(n )

class solution { public : vectorintinordertraversal (treenode * root ) { stackTreeNode * MyStack; 矢量输入RES; wile (路线!=nullptr ||! MyStack.empty () )//2处的路由判断为空指针如果被使用! 路线是错的,我不能理解,但我受到了很大的冲击{while (路线!=nullptr(MyStack.push ) ) root; root=root-left } root=mystack.top (; RES.push _ back (根val; MyStack.pop (; 根=根-光}返回RES; }; 解法Morris解法

这两种解决方案都隐式或显式保留堆栈的路径,以便在将左节点的值入队后找到父节点和右节点。 该解法是在空间上节约维护成本。 一般的想法是利用各节点的左子树的最右节点的右指针(一定是空指针),来指向该子树的父节点。 这样,对于每个节点,在遍历“左”之后,可以在添加的指针处找到“根”,并且可以找到“右”。

时间的复杂性是o(n ) )。 具体而言,每个节点遍历两次,因此为2n。

空间复杂性o(1)没有额外的使用空间

类别解决方案{ public : vectorintinordertraversal (treenode * root ) { vectorint res; TreeNode *predecessor=nullptr; wile (路线!=nullptr(if ) root-left!=nullptr(/predecessor节点在当前根节点上向左一步,直到不能向右); 微信(predecessor-right!=nullptr predecessor-right!=root(//找到左侧子树的最右边节点,在predecessor中{ predecessor=predecessor-right; }if(predecessor-right==nullptr ) /说明当前是用右指针建立父子连接的过程(将predecessor的右指针指向root,左部分的树({ predecessor-- tr } root=root-left } else //表示当前已建立连接,已访问通过获取val值获取res的进程中的//左子树,{ RES.push _ back (根_ back ) predecessor-right=nullptr; 如果只是为了获得方便的结果,以便恢复//树的结构,则实际上可以不使用此步骤。如果在//leetcode测试中注释掉此行的代码,则可能是因为更改了树的结构}//如果没有左子项,则直接访问右子项的else{RES.push_back(root-val ); 根=根-光} }返回RES; };

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。