当前位置:   article > 正文

代码随想录算法训练营Day14| 二叉树递归遍历、 迭代遍历、统一迭代

代码随想录算法训练营Day14| 二叉树递归遍历、 迭代遍历、统一迭代

二叉树递归遍历

代码随想录

思路:

代码:

先序:

  1. class Solution {//递归法
  2. public List<Integer> preorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<>();
  4. preorder(root, res);
  5. return res;
  6. }
  7. private void preorder(TreeNode root, List<Integer> res){//1、确定返回值、参数
  8. if(root == null){//2、确定终止条件
  9. return;
  10. }
  11. res.add(root.val);//3、先处理(打印)中间节点(先序)
  12. preorder(root.left, res);
  13. preorder(root.right, res);
  14. }
  15. }

中序:

  1. class Solution {
  2. public List<Integer> inorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<>();
  4. inorder(root, res);
  5. return res;
  6. }
  7. private void inorder(TreeNode root, List<Integer> res){//1、确定返回值、参数
  8. if(root == null){//2、确定终止条件
  9. return;
  10. }
  11. inorder(root.left, res);
  12. res.add(root.val);//3、中间处理(打印)中间节点(中序)
  13. inorder(root.right, res);
  14. }
  15. }

后序:

  1. class Solution {
  2. public List<Integer> postorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<>();
  4. postorder(root, res);
  5. return res;
  6. }
  7. private void postorder(TreeNode root, List<Integer> res){//1、确定返回值、参数
  8. if(root == null){//2、确定终止条件
  9. return;
  10. }
  11. postorder(root.left, res);
  12. postorder(root.right, res);
  13. res.add(root.val);//3、最后处理(打印)中间节点(后序)
  14. }
  15. }

需要注意的点:

迭代遍历

代码随想录

思路:

代码:

先序:

  1. class Solution {//迭代法 中左右
  2. public List<Integer> preorderTraversal(TreeNode root) {
  3. Stack<TreeNode> stack = new Stack<>();
  4. List<Integer> res = new ArrayList<>();
  5. if(root == null){
  6. return res;
  7. }
  8. stack.push(root);
  9. while(!stack.isEmpty()){
  10. TreeNode cur = stack.pop();
  11. res.add(cur.val);
  12. if(cur.right != null){
  13. stack.push(cur.right);
  14. }
  15. if(cur.left != null){
  16. stack.push(cur.left);
  17. }
  18. }
  19. return res;
  20. }
  21. }

后序:

  1. class Solution {//迭代法 左右中:中右左顺序颠倒即可
  2. public List<Integer> postorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<>();
  4. if(root == null){
  5. return res;
  6. }
  7. Stack<TreeNode> stack1 = new Stack<>();
  8. Stack<TreeNode> stack2 = new Stack<>(); //进行反转的栈
  9. stack1.push(root);
  10. while(!stack1.isEmpty()){
  11. TreeNode cur = stack1.pop();
  12. stack2.push(cur);
  13. if(cur.left != null){
  14. stack1.push(cur.left);
  15. }
  16. if(cur.right != null){
  17. stack1.push(cur.right);
  18. }
  19. }
  20. while(!stack2.isEmpty()){
  21. res.add(stack2.pop().val);
  22. }
  23. return res;
  24. }
  25. }

中序:

  1. class Solution {//迭代法 左中右
  2. public List<Integer> inorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<>();
  4. Stack<TreeNode> stack = new Stack<>();
  5. TreeNode cur = root;
  6. while(cur != null || !stack.isEmpty()){
  7. if(cur != null){
  8. stack.push(cur);
  9. cur = cur.left;
  10. }else{
  11. cur = stack.pop();
  12. res.add(cur.val);
  13. cur = cur.right;
  14. }
  15. }
  16. return res;
  17. }
  18. }

需要注意的点:

1、中序遍历和其他两种遍历不一样,其遍历到的结点不会立刻处理,而是储存到栈里做记录。

2、注意前序、后续遍历左右结点的入栈顺序。

统一迭代

代码随想录

思路:

从头结点开始考虑,按照遍历的相反顺序压入栈,并在中点后加入null作为开始处理此结点的标记。

代码:

中序:

  1. class Solution {//迭代法:统一写法
  2. public List<Integer> inorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<>();
  4. if(root == null){
  5. return res;
  6. }
  7. Stack<TreeNode> stack = new Stack<>();
  8. stack.push(root);
  9. while(!stack.isEmpty()){
  10. TreeNode cur = stack.peek();//读取栈顶元素(结点)
  11. if(cur != null){//没有遇到需要处理的节点
  12. stack.pop();
  13. if(cur.right != null){
  14. stack.push(cur.right);
  15. }
  16. stack.push(cur);
  17. stack.push(null);//标记一下还没处理
  18. if(cur.left != null){
  19. stack.push(cur.left);
  20. }
  21. }else{//碰到null标记就开始录入结果
  22. stack.pop();//将null删除
  23. res.add(stack.pop().val);//录入并删除
  24. }
  25. }
  26. return res;
  27. }
  28. }

 其余两种遍历同理

需要注意的点:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/274821
推荐阅读
相关标签
  

闽ICP备14008679号