美文网首页C算法&面试题程序员
树的镜像&栈模拟递归

树的镜像&栈模拟递归

作者: AwesomeAshe | 来源:发表于2016-04-01 22:19 被阅读88次

这篇文章有两个点,第一个是题目本身,第二个是我觉得很不错的用栈来模拟递归。

题目

做过这么多树的题目后应该觉得用递归很简单吧,我们只需要交换每一个节点的左右节点就行了。
要注意这里要交换指针才能达到效果,交换数是不行的。

然后简单的递归就实现了:

void MirrorReverseTree(treeNode* tree)
{
    if (!tree)
        return;
    //swap left&right
    treeNode* tmp = tree->left;
    tree->left = tree->right;
    tree->right = tmp;

    if (tree->left)
        MirrorReverseTree(tree->left);
    if (tree->right)
        MirrorReverseTree(tree->right);
}

用循环来实现

有人说所有的递归都可以用循环来实现。。但是可以肯定的是,使用递归的时候编写代码要简单一些。
但是使用递归的话,要小心,避免stackoverflow。

这个题呢,我们要遍历每个节点,然后做和递归同样的事情,可以用while循环判断是否到达了叶子节点,可是我仍然觉得直接这样写挺难的,我再想想。。

然而有另一种很巧妙的思路:

由于递归的本质是编译器生成了一个函数调用的栈,因此用循环来完成同样任务时最简单的办法就是用一个辅助栈来模拟递归。首先我们把树的头结点放入栈中。在循环中,只要栈不为空,弹出栈的栈顶结点,交换它的左右子树。 如果它有左子树, 把它的左子树压入栈中; 如果它有右子树, 把它的右子树压入栈中。这样在下次循环中就能交换它儿子结点的左右子树了。

这种认识是很重要的。

所以我们利用这种想法来实现,我们每经过一个节点就把这个节点压入栈,然后对每个节点做同样的事情就可以了。

其实这种题就是说,怎么简单的遍历到整个树。

code:

//non recursive way:
//using a stack
void mirrorReverseTree_2(treeNode* tree)
{
    if (!tree)
        return;
    std::stack<treeNode*> nodeStack;
    nodeStack.push(tree);
    while (nodeStack.size())
    {
        //swap left&right
        treeNode* tmp = tree->left;
        tree->left = tree->right;
        tree->right = tmp;

        if (tree->left)
            nodeStack.push(tree->left);
        if (tree->right)
            nodeStack.push(tree->right);
    }
    
}

其实这个函数里,
if (tree->left) nodeStack.push(tree->left); if (tree->right) nodeStack.push(tree->right);
这两个语句让人深深的感觉到有递归的影子啊!

文章参考何海涛大神文章

相关文章

  • 树的镜像&栈模拟递归

    这篇文章有两个点,第一个是题目本身,第二个是我觉得很不错的用栈来模拟递归。 做过这么多树的题目后应该觉得用递归很简...

  • 二叉树的镜像

    描述 操作给定的二叉树,将其变换为源二叉树的镜像。源二叉树 代码 递归 非递归用栈

  • 不一样的二叉树非递归遍历

    本篇将讨论模拟系统栈的二叉树非递归遍历,并由此讨论一般化的将递归程序改为非递归程序的方式。 二叉树的非递归遍历 就...

  • 递归模拟栈

    之前写过一个栈模拟递归那个题是不让用递归(话说我有次笔试也是不让用递归) 简单的介绍一下,递归本质是一个栈结构,不...

  • Morris遍历二叉树

    前言 对于二叉树的遍历,递归的前、中、后序遍历可以说是最经典、最简单的,其次,非递归版的就是手动压栈的方式模拟递归...

  • LC树题目分类详解

    leetcode 98 验证二叉排序树的递归写法 leetcode 101 树的镜像对称判断 网上解答思路递归结束...

  • 二叉树

    结构体 创建二叉树 递归遍历 栈操作 非递归遍历 层次遍历 完整代码

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • 二叉树的非递归遍历一(先序/JAVA)

    前言 二叉树的非递归遍历对于初学者来说可能不太容易掌握,其实它源于递归遍历,只是把递归栈换成了我们自己的栈。掌握了...

  • 用循环遍历树

    树的遍历用递归法最为简便,那么用循环该如何实现呢? 用循环方法后序遍历树。递归的本质是用了栈结构,不能用递归就自己...

网友评论

    本文标题:树的镜像&栈模拟递归

    本文链接:https://www.haomeiwen.com/subject/dgpylttx.html