树的各种遍历写法总结(C#版)

这篇博客汇总了树的前序、中序、后序遍历的C#实现,包括递归和迭代两种方法,并特别介绍了Morris遍历的思路和代码,旨在为C#开发者提供便捷的参考资料。
摘要由CSDN通过智能技术生成

树的各种遍历写法总结(C#版)

兄弟们,我总结了各种各样树的遍历。方便大家去快速的查找,而且我发现C sharp的内容在网络上真的相较于JAVA和C++来说确实要少好多一些。咱也得出点力呀

树的遍历非常重的确需要的牢记。以下内容整理自《代码随想录》。参加算法训练营的一个小总结。因为在写各种数的便利的时候,发现树的便利花样繁多。有各种各样的方法。卡哥已经按方法不同前中后续讲完了。此处便是将前序遍历,中序遍历,后续遍历把他们的方法列出来,加以总结。方便在有需要的时候查阅。Morris遍历是在leeetcode抄的不一定对(我都能发现力扣有错别字,有错完全可能,运行不了也正常)。代码稍加修改可能就可以运行了。

前序、中序、后序的递归写法

树的遍历,最常用的还得是递归的遍历方法。好写也好记。最开始对于递归看起来可能有些吃力,但是只要看明白的原理就非常简单了。

这里有个理解的小技巧。这个理解方式有点类似于俄罗斯套娃的全部打开。我们可以把俄罗斯套娃看作一个大的套娃外壳和里面一系列套娃外壳所组成的一个小套娃。而我们可以把最外层套娃外壳拿去,里面的套娃也可以看做一个大的套娃外壳。和一系列套娃外壳所组成的小套娃。反复把外壳拿去。最终所有的套娃会被我们拆成一排也就完成了套娃的“遍历”。

同样树可以看作一个大套娃,里边的两枝看做两个小套娃。不同的遍历顺序就相当于把最大的那个套娃外壳放在两个小套娃的左边,中间还是右边。以前序为例。

第一步,将大套娃拆出来放在左边两个小套娃依次排开。

下一步,将未拆完的套娃。拆一层将拆出来的壳,放在所拆位置的左边,两个小小套娃第一个放在刚才拆的位置,第二个放在所拆位置右边。

下N步,重复操作上一步直至所有套娃都只有一层。遍历结束

下面是递归写法代码

public class Solution
{
   
    //此函数包含了前中后序稍加修改即可
    public IList<int> Traversal(TreeNode root)
    {
   
        IList<int> result = new IList<int>();
        preorder(root, result);
        return result;

        void preorder(TreeNode root, IList<int> result)
        {
   
            if (root == null)
            {
   
                return;
            }
            result.Add(root.val);
            preorder(root.left, result);
            preorder(root.right, result);
        }

        void inorder(TreeNode root, IList<int> result)
        {
   
            if (root == null)
            {
   
                return;
            }

            inorder(root.left, result);
            result.Add(root.val);
            inorder(root.right, result);
        }
        void postorder(TreeNode root, IList<int> result)
        {
   
            if (root == null)
            {
   
                return;
            }
            postorder(root.left, result);
            postorder(root.right, result);
            result.Add(root.val);
        }
    }
}

前序、中序、后序的迭代写法(前中后写法不统一)

很多递归的程序都可经过一定的修改为非递归的写法,以下是树的非递归的写法——树的迭代遍历。下面的三种写法前中,后续都不太一致。

前序遍历

public class Solution
{
    public IList<int> PreorderTraversal(TreeNode root)
    {
        IList<int> traversal = new List<int>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode node = root;
        while (stack.Count > 0 || node != null)
        {
            while (node != null)
            {
                traversal.Add(node.val);
                stack.Push(node);
                node = node.left;
            }
            node = stack.Pop().right;
        }
        return traversal;
    }
}

中序遍历

public class Solution
{
   
    public IList<int> InorderTraversal(TreeNode root)
    {
   
        IList<int> result = new List<int>();
        if (root == null)
        {
   
            return result;
        }
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode node = root;
        while (node != null || stack.Count() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Javie Deng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值