LeetCode 中序遍历二叉树

52 篇文章 1 订阅
51 篇文章 1 订阅

在线工具
在这里插入图片描述
中序遍历是指将二叉树转换成 [左边节点],[中间节点],[右边节点] 格式的一维数组,以下为实现

        #region 使用后进先出集合实现【不使用额外对象封装实现】
        
        public IList<int> InorderTraversal(TreeNode root)
        {
            var rets = new List<int>();

            var stack = new Stack<TreeNode>();
            if (root != null)
                stack.Push(root);
            while (stack.Count > 0)
            {
                var node = stack.Peek();
                if (node.left != null)
                {
                    stack.Push(node.left);
                    node.left = null;
                }
                else
                {
                    rets.Add(node.val);
                    stack.Pop();
                    if (node.right != null)
                    {
                        stack.Push(node.right);
                    }
                }
            }
            return rets;
        }

        #endregion
        #region 使用后进先出集合实现【不更改输入元素实现】

        public class Node
        {
            public Node(TreeNode treeNode)
            {
                TreeNode = treeNode;
                Left = true;
            }
            public TreeNode TreeNode { get; set; }
            public bool Left { get; set; }
        }
        public IList<int> InorderTraversal(TreeNode root)
        {
            var rets = new List<int>();

            var stack = new Stack<Node>();
            if (root != null)
                stack.Push(new Node(root));
            while (stack.Count > 0)
            {
                var node = stack.Peek();
                if (node.Left)
                {
                    node.Left = false;
                    if (node.TreeNode.left != null)
                    {
                        stack.Push(new Node(node.TreeNode.left)); //将最左边节点存入队列
                    }
                }
                else
                {
                    rets.Add(node.TreeNode.val);
                    stack.Pop(); //移除当前项
                    if (node.TreeNode.right != null)
                    {
                        stack.Push(new Node(node.TreeNode.right)); //将最右边节点存入队列
                    }
                }
            }

            return rets;
        }

        #endregion
        #region 递归解法
        public IList<int> InorderTraversal(TreeNode root)
        {
            var rets = new List<int>();
            if (root != null)
                InorderTraversal(root, rets);
            return rets;
        }

        private static void InorderTraversal(TreeNode root, List<int> rets)
        {
            if (root.left != null)
                InorderTraversal(root.left, rets);
            rets.Add(root.val);
            if (root.right != null)
                InorderTraversal(root.right, rets);
        }
        #endregion
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值