二叉树非递归遍历方法(C#)

前段时间写了二叉树的遍历算法,递归方法很简单几行代码就能搞定,但是非递归算法还是有点伤脑细胞。代码如下,可能有问题,希望博友指正,谢谢。

public class TreeNode

{

    public TreeNode LChild

    {

        get;

        set;

    }

 

    public TreeNode RChild

    {

        get;

        set;

    }

    public string Data

    {

        get;

        set;

    }

 

    //构造一颗简单的二叉树

    public static TreeNode CreateTree()

    {

        TreeNode root = new TreeNode() { Data = "-" };

        root.LChild = new TreeNode() { Data = "+" };

        root.RChild = new TreeNode() { Data = "/" };

        root.LChild.LChild = new TreeNode() { Data = "a" };

        root.LChild.RChild = new TreeNode() { Data = "*" };

        root.LChild.RChild.LChild = new TreeNode() { Data = "b" };

        root.LChild.RChild.RChild = new TreeNode() { Data = "-" };

        root.LChild.RChild.RChild.LChild = new TreeNode() { Data = "c" };

        root.LChild.RChild.RChild.RChild = new TreeNode() { Data = "d" };

        root.RChild.LChild = new TreeNode() { Data = "e" };

        root.RChild.RChild = new TreeNode() { Data = "f" };

 

        return root;

    }

 

    //递归先序遍历

    public static void PreOrderTranverse(TreeNode root)

    {

        if (root != null)

        {

            PrintNode(root);

            PreOrderTranverse(root.LChild);

            PreOrderTranverse(root.RChild);

        }

    }

 

    //递归中序遍历

    public static void InOrderTransverse(TreeNode root)

    {

        if (root != null)

        {

            InOrderTransverse(root.LChild);

            PrintNode(root);

            InOrderTransverse(root.RChild);

        }

    }

 

    //递归后续遍历

    public static void PostOrderTransverse(TreeNode root)

    {

        if (root != null)

        {

            PostOrderTransverse(root.LChild);

            PostOrderTransverse(root.RChild);

            PrintNode(root);

        }

    }

 

    //非递归中序遍历

    public static void NonrecursiveInOrderTraverse(TreeNode root)

    {

        Stack<TreeNode> nodeStack = new Stack<TreeNode>();

 

        if (root == null)

        {

            return;

        }

 

        var node = root;

        while (node != null || nodeStack.Count != 0)

        {

            while (node != null)

            {

                nodeStack.Push(node);

                node = node.LChild;

            }

            node = nodeStack.Pop();

 

            PrintNode(node);

            node = node.RChild;

        }

    }

 

    //非递归后续遍历

    public static void NonrecursivePostOrderTraverse(TreeNode root)

    {

        Stack<TreeNode> nodeStack = new Stack<TreeNode>();

 

        if (root == null)

        {

            return;

        }

 

        var node = root;

        while (node != null || nodeStack.Count != 0)

        {

            while (node != null)

            {

                nodeStack.Push(node);

                if (node.LChild == null)

                {

                    node = node.RChild;

                }

                else

                {

                    node = node.LChild;

                }

            }

 

            node = nodeStack.Pop();

 

            PrintNode(node);

            if (nodeStack.Count != 0 && node == nodeStack.Peek().LChild)

            {

                node = nodeStack.Peek().RChild;

            }

            else

            {

                node = null;

            }

        }

    }

 

    //打印树节点

    public static void PrintNode(TreeNode node)

    {

        System.Console.Write(node.Data);

    }

}

转载于:https://www.cnblogs.com/KevinPan/archive/2010/09/10/1823523.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值