二叉树后序遍历

二叉树后序遍历

后序遍历
顺序为:左子树->右子树->跟节点
先遍历左子树,然后遍历右子树,最后遍历跟节点,以此轮推,直到遍历所有节点
在这里插入图片描述

如上后序遍历的结果为:1 3 2 5 4 7 9 8 6

后序遍历的逻辑如下:
后序遍历
1:每个节点的值只获取一次
2:如果有左子树,执行1 之前要先获取左子树所有节点的值,否则执行3
3:如果有右子树,执行 2 之后要获取右子树所有节点的值
4:所有节点值的获取,要遵守 1、2、3 条

后序遍历的两种方式:递归实现、迭代实现

递归实现如下

        public IList<int> PostorderTraversal(TreeNode root)
        {
            // 集合存储访问到的节点值
            List<int> list = new List<int>();
            // 调用递归函数
            PostorderTraversal(root, list);
            return list;
        }

        // 递归实现
        public void PostorderTraversal(TreeNode root, List<int> list)
        {
            if (null == root)
            {
                return;
            }

            // 递归调用左子树
            PostorderTraversal(root.left, list);

            // 递归调用右子树
            PostorderTraversal(root.right, list);

            // 将节点的值存储到集合中
            list.Add(root.val);
        }

迭代实现如下

        // 迭代实现
        public Stack<int> PostorderTraversal3(TreeNode root)
        {
            // 下面使用两个栈Stack结构
            // stack 存放遍历过程中的节点
            // resultStack 存放最终阶段顺序
            
            // 1:将跟节点放入 stack 
            // 2:节点从 stack 取出,放入 resultStack 
            // 3:节点有左字树,将左子节点 放入 stack 
            // 4:节点有右子树,将右子节点 放入 stack
            // 最终放入 resultStack 的节点顺序就是:跟节点、右子树、左子树
            // 然后顺次从 resultStack 将节点取出得到的顺序就是: 左子树、右子树、根节点
            
            Stack<int> resultStack = new Stack<int>();
            if (null == root)
            {
                return resultStack;
            }

            Stack<TreeNode> stack = new Stack<TreeNode>();
            // 将跟节点入栈
            stack.Push(root);
            while (stack.Count > 0)
            {
                // 节点出栈
                TreeNode node = stack.Pop();
                // 将 stack 出栈的节点值存入 resultStack
                resultStack.Push(node.val);

                // 如果左子树不为空,则将左子树入栈stack
                if (null != node.left)
                {
                    stack.Push(node.left);
                }

                // 如果右子树不为空,则将右子树入栈stack
                if (null != node.right)
                {
                    stack.Push(node.right);
                }
            }

            return resultStack;
        }

至此二叉树后续遍历原理以及实现均已奉上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值