当前位置:科技动态 > 中序遍历是怎样的

中序遍历是怎样的

  • 发布:2023-10-10 01:35

中序遍历的遍历方法是:对于当前节点,先遍历左子树,然后访问当前节点,最后遍历右子树。中序遍历是二叉树遍历的一种,也称为中根遍历、中序遍历。

//递归 类解决方案1 ​​{ 民众: 矢量 inorderTraversal(TreeNode* root) { 矢量 ret; if(root==NULL)返回ret; inorderHelper(ret,根); 返回ret; } 私人的: void inorderHelper(向量& ret,TreeNode* root) { if(root==NULL)返回; inorderHelper(ret,根->左); ret.push_back(root->val); inorderHelper(ret,根->右); } };

登录后复制

2.迭代法

迭代法中,从根节点开始寻找二叉树最左边的节点,将传递过来的节点保存在一个栈中,找到后访问最左边的节点。对于每个节点来说,它都是基于它自己的。访问完根子树的根节点后,就可以去找右孩子了。代码如下:

//迭代,使用堆栈
类解决方案2 {
民众:
    矢量 inorderTraversal(TreeNode* root) {
        矢量 ret;
        if(root==NULL)返回ret;
        树节点 *curr=root;
        堆叠 st;while(!st.empty()||curr!=NULL)
        {
            while(curr!=NULL)
            {
                st.push(curr);
                curr=curr->左;
            }
            curr=www.sychzs.cn();
            st.pop();
            ret.push_back(curr->val);
            curr=curr->右;
        }
        返回ret;
    }
};
登录后复制

这种方法的时间复杂度是O(n),空间复杂度也是O(n)。

3。莫里斯法

这个方法是莫里斯发明的。读完之后,感觉非常精妙。该方法不使用递归,不使用栈,以O(1)空间复杂度完成二叉树遍历。该方法的基本思想是将所有右子为NULL的节点的右子指向后继节点(对于右子不为null的节点,右子为下一个要访问的节点)。这样,对于任意一个节点,访问它后,它的右子已经指向下一个要访问的节点。对于最右边的节点,不需要这样的操作。注意,这个操作是在遍历过程中完成的,完成节点访问后,树会被恢复。整个循环的判断条件是当前节点是否为空。比如上面的二叉树,遍历过程如下(根据当前节点c的位置):

(1) 当前节点为10,因为左儿子不为空,无法访问。找到c的左子树的最右边的节点p:

//莫里斯遍历,没有堆栈 类解决方案3 { 民众: 矢量 inorderTraversal(TreeNode* root) {矢量 ret; if(root==NULL)返回ret; 树节点 *curr=root; 树节点*pre; 同时(当前) { if(当前->左==NULL) { ret.push_back(curr->val); curr=curr->右; } 别的 { 前=当前->左; while(前->右&&前->右!=curr) 前=前->右; if(前->右==NULL) { 前->右=当前; curr=curr->左; } 别的 { ret.push_back(curr->val); 前->右=NULL; curr=curr->右; } } } 返回ret; } };

登录后复制

推荐教程:《C#》

以上是中序遍历的具体实现过程。请关注其他相关文章以获取更多信息!

相关文章