【算法总结】递归和非递归实现二叉树的先序,中序,后序遍历

我的 CSDN 博客:blog.csdn.net/gdutxiaoxu
我的掘金:juejin.im/user/220747…
github: github.com/gdutxiaoxu/
微信公众号:程序员徐公

前言

说到树的四种遍历方式,可能大家第一时间都会想到它的四种遍历方式,并快速说了它的特点。

先序(先根)遍历:即先访问根节点,再访问左孩子和右孩子

中序遍历:先访问做孩子,再访问根节点和右孩子

后序遍历:先访问左孩子,再访问右孩子,再访问根节点

层次遍历:按照所在层数,从下往上遍历

接着当你要手动写代码的时候,你写得出来嘛?

递归实现二叉树的前序,中序,后续遍历

非递归二叉树的实现前序,中序,后续遍历

实现二叉树的层序遍历

今天,就让我们一起来看看,怎样实现它?

前中后序遍历

假如有以下树

    1    / \   2   3  / \   \ 4   5   6 复制代码

它的前中后续遍历分别如下

层次遍历顺序:[1 2 3 4 5 6]

前序遍历顺序:[1 2 4 5 3 6]

中序遍历顺序:[4 2 5 1 3 6]

后序遍历顺序:[4 5 2 6 3 1]

层次遍历使用 BFS 实现,利用的就是 BFS 一层一层遍历的特性;而前序、中序、后序遍历利用了 DFS 实现。

前序、中序、后序遍只是在对节点访问的顺序有一点不同,其它都相同。

递归实现前序,中序,后序遍历

① 前序

void dfs(TreeNode root) {     visit(root);     dfs(root.left);     dfs(root.right); } 复制代码

② 中序

void dfs(TreeNode root) {     dfs(root.left);     visit(root);     dfs(root.right); 复制代码

③ 后序

void dfs(TreeNode root) {     dfs(root.left);     dfs(root.right);     visit(root); } 复制代码 非递归实现二叉树的先序,中序,后序遍历 非递归实现二叉树的前序遍历

144. Binary Tree Preorder Traversal (Medium)

Leetcode / 力扣:leetcode-cn.com/problems/bi…

class Solution {     //迭代     public List<Integer> preorderTraversal(TreeNode root) {         List<Integer> res = new ArrayList<Integer>();         Stack<TreeNode> stack = new Stack<TreeNode>();         while(root!=null || !stack.empty()){             while(root!=null){                 res.add(root.val); //先将节点加入结果队列                 stack.push(root);  //不断将该节点左子树入栈                 root = root.left;             }             root = stack.pop(); //栈顶节点出栈             root = root.right; //转向该节点右子树的左子树(下一个循环)         }         return res;      } } 复制代码 非递归实现二叉树的中序遍历

94. Binary Tree Inorder Traversal (Medium)

Leetcode / 力扣:leetcode-cn.com/problems/bi…

class Solution {     //迭代     public List<Integer> preorderTraversal(TreeNode root) {         List<Integer> res = new ArrayList<Integer>();         Stack<TreeNode> stack = new Stack<TreeNode>();         while(root!=null || !stack.empty()){             while(root!=null){                 stack.push(root);  //不断将该节点左子树入栈                 root = root.left;             }             root = stack.pop(); //栈顶节点出栈             res.add(root.val); //将节点加入结果队列             root = root.right; //转向该节点右子树的左子树(下一个循环)         }         return res;      }  } 复制代码 非递归实现二叉树的后序遍历

145. Binary Tree Postorder Traversal (Medium)

Leetcode / 力扣:leetcode-cn.com/problems/bi…

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdyfp.html