二叉树遍历
二叉树遍历有四种顺序:前序、中序、后序和层次
下面使用不同的方法去使用这四种顺序,输出二叉树遍历的结果
前序
遍历框架
直接利用我们之前说过的遍历框架
在前序位置添加逻辑即可
1 | List<Integer> res; |
分解问题
前序遍历:根节点 + 左子树 + 右子树
1 | public List<Integer> preOrder(TreeNode root) { |
使用栈
法一
1 | public List<Integer> preOrder(TreeNode root){ |
法二
1 | public List preOrder(TreeNode root){ |
这两种方法使用栈的区别就是
对于cur的更新方式不同,
法一是直接将栈顶元素的right
赋值给cur
法二是拿到第一个出栈元素的right
不为空的元素赋值给cur
两种方法都可以,但是第一种写起来更为简便
法三
1 | public List<Integer> preorderTraversal(TreeNode root) { |
中序
遍历框架
直接利用我们之前说过的遍历框架
在中序位置添加逻辑即可
1 | List<Integer> res; |
分解问题
中序遍历:左子树 + 根节点 + 右子树
1 | public List<Integer> inOrder(TreeNode root) { |
使用栈
法一
1 | public List inOrder(TreeNode root){ |
法二
1 | public List inOrder(TreeNode root){ |
这里的两种方法的区别和前序顺序遍历的使用栈的方法的区别相同
后序
遍历框架
直接利用我们之前说过的遍历框架
在后序位置添加逻辑即可
1 | List<Integer> res; |
分解问题
后序遍历:左子树 + 右子树 + 根节点
1 | public List<Integer> postOrder(TreeNode root) { |
使用栈
后序顺序比其他顺序特殊
它需要在左右子树都遍历完之后才可以将节点的值放入集合中
如何知道左右子树都遍历完了
这就是使用栈完成后序顺序遍历的难点
单栈标记法
1 | public List postOrder(TreeNode root){ |
双栈法
1 | public List postOrder(TreeNode root){ |
层次
队列
使用队列来暂存节点,利用其先进先出的特性来达到层次遍历的效果
法一
1 | public List levelOrder (TreeNode root){ |
法二
1 | public List levelOrder (TreeNode root){ |
递归
使用递归函数来得到层次遍历结果
法一
1 | List<List<Intger>> res; |
法二
这种方法叫尾递归
它可以被改写为层次遍历使用队列的法二
它两本质是一样的
1 | List<List<Intger>> res; |