二叉树后序遍历

二叉树后序遍历

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

如上后序遍历的结果为: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;
        }

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 后序遍历二叉树的算法代码如下:def postOrder(root): if root: postOrder(root.left) postOrder(root.right) print(root.data) ### 回答2: 二叉树后序遍历是指先访问左子树,再访问右子树,最后访问根节点的遍历方式。接下来给出二叉树后序遍历的算法代码的实现。 在二叉树后序遍历的算法代码实现中,我们可以使用递归或栈来辅助完成。这里给出使用递归的实现方式。 首先定义二叉树的节点数据结构: ``` class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right ``` 然后实现后序遍历的函数: ``` def postorderTraversal(root): if root is None: return [] result = [] result += postorderTraversal(root.left) # 访问左子树 result += postorderTraversal(root.right) # 访问右子树 result.append(root.val) # 访问根节点 return result ``` 代码中使用递归的方式来实现后序遍历。首先判断根节点是否为空,若为空,则返回空列表。然后递归地访问左子树,再递归地访问右子树。最后将根节点的值添加到结果列表中。 下面给出一个示例来展示如何使用该函数进行后序遍历: ``` # 创建一个二叉树 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) # 对二叉树进行后序遍历 result = postorderTraversal(root) # 输出遍历结果 print(result) # 输出 [4, 5, 2, 3, 1] ``` 以上就是二叉树后序遍历的算法代码的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值