当前位置:   article > 正文

Day13|二叉树的递归遍历,迭代遍历

Day13|二叉树的递归遍历,迭代遍历

 看黑马这个视频有指导作用

基础数据结构-102-二叉树-深度优先遍历_哔哩哔哩_bilibili

递归:一条自调用,可以看做是一条线的流程图;两条自调用,是二叉树状的流程图

使用递归的条件,第一级变量与第n级变量的的执行行为是一样的

可取n=1与n=3做流程图

递归:更新节点与更新int的递归,画递归树状图或递归线性图,二叉树本来就是树状的较易理解

前序遍历:对于一个三角 中左右输出,直接进入最后一个子叶节点的函数中体会递归流程

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public List<Integer> preorderTraversal(TreeNode root) {
  18. List<Integer> res = new ArrayList<>();
  19. preOrder(root , res);
  20. return res;
  21. }
  22. public void preOrder(TreeNode root , List res){
  23. if(root == null){
  24. return;
  25. }
  26. res.add(root.val);
  27. preOrder(root.left , res);
  28. preOrder(root.right , res);
  29. }
  30. }

后序遍历,对于一个三角 左右中输出

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public List<Integer> postorderTraversal(TreeNode root) {
  18. List<Integer> res = new ArrayList<>();
  19. preOrder(root , res);
  20. return res;
  21. }
  22. public void preOrder(TreeNode root , List res){
  23. if(root == null){
  24. return;
  25. }
  26. preOrder(root.left , res);
  27. preOrder(root.right , res);
  28. res.add(root.val);
  29. }
  30. }

中序遍历,对于一个三角 左中右输出

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public List<Integer> inorderTraversal(TreeNode root) {
  18. List<Integer> res = new ArrayList<>();
  19. preOrder(root , res);
  20. return res;
  21. }
  22. public void preOrder(TreeNode root , List res){
  23. if(root == null){
  24. return;
  25. }
  26. preOrder(root.left , res);
  27. res.add(root.val);
  28. preOrder(root.right , res);
  29. }
  30. }

迭代法:

基础数据结构-102-二叉树-深度优先遍历_哔哩哔哩_bilibili黑马这个视频很好,用的就是黑马模版

前序是最简单的,在深度遍历左枝时就输出,左枝遍历到底,构成中左右逆时针三角

中序次简单,先深到左枝底部null,回溯的时候输出,构成左中右顺时针三角

回溯是直接把cur跳到父节点的right上,不是回溯到父节点上

cur到null时只会到另一个null或父节点的right节点上。

体会用词深度遍历,想象成副对角线一条一条,自上而下积分,自左而右积分

后序遍历佐能体现,深度自上而下再自左而右 

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public List<Integer> postorderTraversal(TreeNode root) {
  18. TreeNode cur = root;
  19. Stack<TreeNode> stack = new Stack<>();
  20. List<Integer> res = new ArrayList<>();
  21. TreeNode pop = null;
  22. while(cur != null || !stack.empty()){
  23. if(cur != null){
  24. stack.push(cur);
  25. cur = cur.left;
  26. }else {
  27. TreeNode peek = stack.peek();
  28. if(peek.right == null){
  29. pop = stack.pop();
  30. res.add(pop.val);
  31. }else if(peek.right == pop){
  32. pop = stack.pop();
  33. res.add(pop.val);
  34. }else if(peek.right != null && peek.right != pop){
  35. cur = peek.right;
  36. }
  37. }
  38. }
  39. return res;
  40. }
  41. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/274846
推荐阅读
相关标签
  

闽ICP备14008679号