1. 题目
描述
给定一个二叉树,返回他的后序遍历的序列。
后序遍历是值按照 左节点->右节点->根节点 的顺序的遍历。
数据范围:二叉树的节点数量满足 0≤n≤100 ,二叉树节点的值满足 1≤val≤100 ,树的各节点的值各不相同
样例图:
示例1
输入:
{1,#,2,3}
返回值:
[3,2,1]
示例2
输入:
{1}
返回值:
[1]
2. 解题思路
需要先明确二叉树【后序】遍历的规则:
二叉树的遍历一般使用【递归】的方法。如果要采用递归方法需满足递归的2个条件:
可以看出,对于左子树、右子树的遍历操作与整个二叉树一样,只是数据规模不同。
对于整颗二叉树来说,叶子节点左右子树都是Null,满足递归的第二个条件:不能无限循环,有终止条件(节点为Null)。因此可以使用递归来完成二叉树的后序遍历。这时,就可以依据前序遍历的规则写出递推公式与伪代码:
如果文字描述的不太清楚,你可以参考视频的详细讲解。
- Python版本:https://www.bilibili.com/cheese/play/ep1371456
- Java版本:https://www.bilibili.com/cheese/play/ep1367106
- Golang版本:https://www.bilibili.com/cheese/play/ep1364646
3. 编码实现
核心代码如下:
type TreeNode struct {
Val int //节点值
Left *TreeNode //左子树
Right *TreeNode //右子树
}
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型一维数组
*/
func postorderTraversal(root *TreeNode) []int {
// write code here
list := make([]int, 0)
postOrder(&list, root) //注意:传递的是切片对应的指针(切片的地址),否则会变成值传递,最后返回空切片
return list
}
func postOrder(list *[]int, root *TreeNode) {
// 2. 递归终止条件:遇到空节点则返回
if root == nil {
return
}
// 1. 问题分解(递推公式)
// 1.1 先左子树
postOrder(list, root.Left)
//1.2 再去右子树
postOrder(list, root.Right)
//1.3 最后访问根节点
*list = append(*list, root.Val)
}
具体完整代码你可以参考下面视频的详细讲解。
- Python版本:https://www.bilibili.com/cheese/play/ep1371456
- Java版本:https://www.bilibili.com/cheese/play/ep1367106
- Golang版本:https://www.bilibili.com/cheese/play/ep1364646
4.小结
后序遍历的规则是:先左子树、再右子树、最后节点。
二叉树的后序遍历满足递归的两个条件,因此可以通过递归很快写出对应的递推公式:
f(node)= (node.左子树) +f (node.右子树) +output(node.val),其中 f (空节点) = 空。
再根据递推公式就可以很快将其翻译成对应的代码。
《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:
✅ 链表 ✅ 二叉树 ✅二分查找、排序 ✅ 堆、栈、队列 ✅回溯算法 ✅ 哈希算法 ✅ 动态规划
无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!
- Python编码实现:https://www.bilibili.com/cheese/play/ep1509965
- Java编码实现:https://www.bilibili.com/cheese/play/ep1510007
- Golang编码实现:https://www.bilibili.com/cheese/play/ep1509945
对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。
今日佳句:人生得意须尽欢,莫使金樽空对月。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。