用递归与迭代完成二叉树的三种遍历

柔情只为你懂 2023-10-14 21:22 101阅读 0赞

a1eb6067fb12419da9b9fbccebe7c4cb.jpeg

目录

二叉树的前序遍历

题目

前序遍历题目链接

递归代码

1.利用方法返回值的代码

2.返回值为void的代码

非递归实现前序遍历(利用栈stack)

1.利用方法返回值的代码

2.返回值为void的代码

二叉树的中序遍历

题目

:给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

中序遍历题目链接

递归代码

1.利用方法返回值的代码

2.返回值为void的代码

非递归实现中序遍历(利用栈stack)

1.利用方法返回值的代码

2.返回值为void的代码

二叉树的后序遍历

题目

后序遍历题目链接

递归代码

1.利用方法返回值的代码

2.返回值为void的代码

非递归实现中序遍历(利用栈stack)

1.利用方法返回值的代码

2.返回值为void的代码

完结撒花✿✿ヽ(°▽°)ノ✿✿


遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点—->根的左子树—->根的右子树。
中序遍历(Inorder Traversal)——根的左子树—->根节点—->根的右子树。
后序遍历(Postorder Traversal)——根的左子树—->根的右子树—->根节点

二叉树的前序遍历

题目

:给你二叉树的根节点 root ,返回它节点值的 前序遍历

前序遍历题目链接

: https://leetcode.cn/problems/binary-tree-preorder-traversal/

递归代码

1.利用方法返回值的代码

  1. class Solution {
  2. public List<Integer> preorderTraversal(TreeNode root) {
  3. List<Integer> ret = new ArrayList<Integer>();
  4. if(root==null){
  5. return ret;
  6. }
  7. ret.add(root.val);
  8. List<Integer> leftTree=preorderTraversal(root.left);
  9. ret.addAll(leftTree);
  10. List<Integer> rightTree=preorderTraversal(root.right);
  11. ret.addAll(rightTree);
  12. return ret;
  13. }
  14. }

2.返回值为void的代码

  1. // 前序遍历 根 左子树 右子树
  2. public void preOrder(BTNode root) {
  3. if (root == null) {
  4. return;
  5. }
  6. System.out.print(root.value + " ");
  7. preOrder(root.left);
  8. preOrder(root.right);
  9. }

非递归实现前序遍历(利用栈stack)

1.利用方法返回值的代码

  1. class Solution {
  2. public List<Integer> preorderTraversal(TreeNode root) {
  3. List<Integer> ret = new ArrayList<>();
  4. if (root == null) {
  5. return ret;
  6. }
  7. TreeNode cur = root;
  8. Deque<TreeNode> stack = new ArrayDeque<>();
  9. while (cur != null || !stack.isEmpty()) {
  10. while (cur != null) {
  11. stack.push(cur);
  12. //System.out.print(cur.val + " ");
  13. ret.add(cur.val);
  14. cur = cur.left;
  15. }
  16. TreeNode top = stack.pop();
  17. cur = top.right;
  18. }
  19. return ret;
  20. }
  21. }

2.返回值为void的代码

  1. class Solution {
  2. public void preOrderNor(BTNode root) {
  3. if (root == null) {
  4. return;
  5. }
  6. BTNode cur = root;
  7. Deque<BTNode> stack = new ArrayDeque<>();
  8. while (cur != null || !stack.isEmpty()) {
  9. while (cur != null) {
  10. stack.push(cur);
  11. System.out.println(cur.value + " ");
  12. cur = cur.left;
  13. }
  14. BTNode top = stack.pop();
  15. cur = top.right;
  16. }
  17. }
  18. }

二叉树的中序遍历

题目

:给定一个二叉树的根节点 root ,返回 它的 中序 遍历

中序遍历题目链接

:https://leetcode.cn/problems/binary-tree-inorder-traversal/

递归代码

1.利用方法返回值的代码

  1. class Solution {
  2. public List<Integer> inorderTraversal(TreeNode root) {
  3. List<Integer> ret = new ArrayList<>();
  4. if (root == null) {
  5. return ret;
  6. }
  7. List<Integer> leftTree = inorderTraversal(root.left);
  8. ret.addAll(leftTree);
  9. ret.add(root.val);
  10. List<Integer> rightTree =inorderTraversal(root.right);
  11. ret.addAll(rightTree);
  12. return ret;
  13. }
  14. }

2.返回值为void的代码

  1. // 中序遍历 左子树 根 右子树
  2. public void inOrder(BTNode root) {
  3. if (root == null) {
  4. return;
  5. }
  6. inOrder(root.left);
  7. System.out.print(root.value + " ");
  8. inOrder(root.right);
  9. }

非递归实现中序遍历(利用栈stack)

1.利用方法返回值的代码

  1. class Solution{
  2. public List<Integer> inorderTraversal(TreeNode root) {
  3. List<Integer> ret = new ArrayList<>();
  4. if (root == null) {
  5. return ret;
  6. }
  7. TreeNode cur = root;
  8. Deque<TreeNode> stack = new ArrayDeque<>();
  9. while (cur != null || !stack.isEmpty()) {
  10. while (cur != null) {
  11. stack.push(cur);
  12. cur = cur.left;
  13. }
  14. TreeNode top = stack.pop();
  15. ret.add(top.val);
  16. cur = top.right;
  17. }
  18. return ret;
  19. }
  20. }

2.返回值为void的代码

  1. class Solution{
  2. public void inOrderNor(BTNode root) {
  3. if (root == null) {
  4. return;
  5. }
  6. BTNode cur = root;
  7. Deque<BTNode> stack = new ArrayDeque<>();
  8. while (cur != null || !stack.isEmpty()) {
  9. while (cur != null) {
  10. stack.push(cur);
  11. cur = cur.left;
  12. }
  13. BTNode top = stack.pop();
  14. System.out.println(top.value + " ");
  15. cur = top.right;
  16. }
  17. }
  18. }

二叉树的后序遍历

题目

:给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历

后序遍历题目链接

:https://leetcode.cn/problems/binary-tree-postorder-traversal/

递归代码

1.利用方法返回值的代码

  1. class Solution {
  2. public List<Integer> postorderTraversal(TreeNode root) {
  3. List<Integer> ret = new ArrayList<Integer>();
  4. if(root==null){
  5. return ret;
  6. }
  7. List<Integer> leftTree = postorderTraversal(root.left);
  8. ret.addAll(leftTree);
  9. List<Integer> rightTree = postorderTraversal(root.right);
  10. ret.addAll(rightTree);
  11. ret.add(root.val);
  12. return ret;
  13. }
  14. }

2.返回值为void的代码

  1. // 后序遍历
  2. public void postOrder(BTNode root) {
  3. if (root == null) {
  4. return;
  5. }
  6. postOrder(root.left);
  7. postOrder(root.right);
  8. System.out.print(root.value + " ");
  9. }

非递归实现中序遍历(利用栈stack)

1.利用方法返回值的代码

  1. class Solution{
  2. public List<Integer> postorderTraversal(TreeNode root) {
  3. List<Integer> ret = new ArrayList<>();
  4. if (root == null) {
  5. return ret;
  6. }
  7. TreeNode cur = root;
  8. TreeNode prev = null;
  9. Deque<TreeNode> stack = new ArrayDeque<>();
  10. while (cur != null || !stack.isEmpty()) {
  11. while (cur != null) {
  12. stack.push(cur);
  13. cur = cur.left;
  14. }
  15. TreeNode top = stack.peek();
  16. if (top.right == null || top.right == prev) {
  17. //System.out.println(top.value + " ");
  18. ret.add(top.val);
  19. stack.pop();
  20. prev = top;
  21. } else {
  22. cur = top.right;
  23. }
  24. }
  25. return ret;
  26. }
  27. }

2.返回值为void的代码

  1. class Solution{
  2. public void postOrderNor(BTNode root) {
  3. if (root == null) {
  4. return;
  5. }
  6. BTNode cur = root;
  7. BTNode prev = null;
  8. Deque<BTNode> stack = new ArrayDeque<>();
  9. while (cur != null || !stack.isEmpty()) {
  10. while (cur != null) {
  11. stack.push(cur);
  12. cur = cur.left;
  13. }
  14. BTNode top = stack.peek();
  15. if (top.right == null || top.right == prev) {
  16. System.out.println(top.value + " ");
  17. stack.pop();
  18. prev = top;
  19. } else {
  20. cur = top.right;
  21. }
  22. }
  23. }
  24. }

完结撒花✿✿ヽ(°▽°)ノ✿✿

410feca848b54f7a90797406962248b6.gif

发表评论

表情:
评论列表 (有 0 条评论,101人围观)

还没有评论,来说两句吧...

相关阅读