当前位置:   article > 正文

[数据结构]二叉树的遍历(递归与非递归)_二叉树层次遍历递归

二叉树层次遍历递归

目录

一:递归思路

1.前序遍历

2.中序遍历

3.后序遍历

 二:子问题思路

1.前序遍历

2.中序遍历

3.后序遍历

 三:非递归思路(利用栈和队列的特性)

1.前序遍历

2.中序遍历

3.后序遍历

4.层序遍历

一:递归思路

1.前序遍历

  1. public void preOrder(TreeNode root) {
  2. // 1. 如果是一棵空树,就直接返回
  3. if (root == null) {
  4. return;
  5. }
  6. // 2. 处理根节点
  7. System.out.print(root.value + " ");
  8. // 3. 处理左子树
  9. preOrder(root.left);
  10. // 4. 处理右子树
  11. preOrder(root.right);
  12. }

2.中序遍历

  1. */
  2. public void inOrder(TreeNode root) {
  3. // 1. 如果是一棵空树,就直接返回
  4. if (root == null) {
  5. return;
  6. }
  7. // 2.先处理左子树
  8. inOrder(root.left);
  9. // 3.处理根节点,打印操作
  10. System.out.print(root.value + " ");
  11. // 4. 处理右子树
  12. inOrder(root.right);
  13. }

3.后序遍历

  1. public void postOrder(TreeNode root) {
  2. // 1. 如果是一棵空树,就直接返回
  3. if (root == null) {
  4. return;
  5. }
  6. // 2. 处理左子树
  7. postOrder(root.left);
  8. // 3. 处理右子树
  9. postOrder(root.right);
  10. // 4. 处理根节点,打印操作
  11. System.out.print(root.value + " ");
  12. }

 二:子问题思路

1.前序遍历

  1. public List<Integer> preorder(TreeNode root) {
  2. // 1.先定义一个这棵树节点的集合
  3. List<Integer> list = new ArrayList<>();
  4. if (root == null) {
  5. return list;
  6. }
  7. // 2. 现在是前序遍历规则,先把根节点的值,加入到集合
  8. list.add(root.value);
  9. // 3. 处理左子树
  10. List<Integer> leftList = preorder(root.left);
  11. // 4. 把左子树的集合合并到当前整棵树的集合中
  12. list.addAll(leftList);
  13. // 5. 处理右子树
  14. List<Integer> rightList = preorder(root.right);
  15. // 6. 把右子树的集合合并到当前整棵树的集合中
  16. list.addAll(rightList);
  17. // 7. 返回最终的结果集合
  18. return list;
  19. }

2.中序遍历

  1. public List<Integer> inorder(TreeNode root) {
  2. // 1.先定义一个这棵树节点的集合
  3. List<Integer> list = new ArrayList<>();
  4. if (root == null) {
  5. return list;
  6. }
  7. // 2. 处理左子树
  8. List<Integer> leftList = inorder(root.left);
  9. // 3. 把左子树的集合合并到当前整棵树的集合中
  10. list.addAll(leftList);
  11. //4. 现在是中序遍历规则,把根节点的值,加入到集合
  12. list.add(root.value);
  13. // 5. 处理右子树
  14. List<Integer> rightList = inorder(root.right);
  15. // 6. 把右子树的集合合并到当前整棵树的集合中
  16. list.addAll(rightList);
  17. // 7. 返回最终的结果集合
  18. return list;
  19. }

3.后序遍历

  1. public void postOrder(TreeNode root) {
  2. // 1.先定义一个这棵树节点的集合
  3. List<Integer> list = new ArrayList<>();
  4. if (root == null) {
  5. return list;
  6. }
  7. // 2. 处理左子树
  8. List<Integer> leftList = postorder(root.left);
  9. // 3. 把左子树的集合合并到当前整棵树的集合中
  10. list.addAll(leftList);
  11. // 5. 处理右子树
  12. List<Integer> rightList = postorder(root.right);
  13. // 6. 把右子树的集合合并到当前整棵树的集合中
  14. list.addAll(rightList);
  15. //7. 现在是后序遍历规则,最后把根节点的值,加入到集合
  16. list.add(root.value);
  17. // 8. 返回最终的结果集合
  18. return list;
  19. }

 三:非递归思路(利用栈和队列的特性)

1.前序遍历

  1. public List<Integer> preorderTraversal(TreeNode root) {
  2. List<Integer> list=new ArrayList<>();
  3. Stack<TreeNode> stack=new Stack<>();
  4. if(root==null){
  5. return list;
  6. }
  7. stack.push(root);
  8. while(!stack.isEmpty()){
  9. TreeNode tmp=stack.pop();
  10. if(tmp.right!=null){
  11. stack.push(tmp.right);
  12. }
  13. //利用栈的特性,先把右节点压入栈底,保证左节点始终先出栈
  14. if(tmp.left!=null){
  15. stack.push(tmp.left);
  16. }
  17. list.add(tmp.val);
  18. }
  19. return list;
  20. }

2.中序遍历

  1. public List<Integer> inorderTraversal(TreeNode root) {
  2. List<Integer> list=new ArrayList<>();
  3. Stack<TreeNode> stack=new Stack<>();
  4. if(root==null){
  5. return list;
  6. }
  7. while(root!=null||!stack.isEmpty()){
  8. while(root!=null){
  9. stack.push(root);
  10. root=root.left;
  11. }
  12. TreeNode tmp=stack.pop();
  13. list.add(tmp.val);
  14. root=tmp.right;
  15. }
  16. return list;
  17. }

3.后序遍历

  1. public List<Integer> postorderTraversal(TreeNode root) {
  2. List<Integer> list=new ArrayList<>();
  3. //使用两个栈
  4. Stack<TreeNode> stack1=new Stack<>();
  5. Stack<TreeNode> stack2=new Stack<>();
  6. if(root==null){
  7. return list;
  8. }
  9. stack1.push(root);
  10. while(!stack1.isEmpty()){
  11. TreeNode tmp=stack1.pop();
  12. stack2.push(tmp);
  13. if(tmp.left!=null){
  14. stack1.push(tmp.left);
  15. }
  16. if(tmp.right!=null){
  17. stack1.push(tmp.right);
  18. }
  19. }
  20. while(!stack2.isEmpty()){
  21. list.add(stack2.pop().val);
  22. }
  23. return list;
  24. }

4.层序遍历

  1. public List<List<Integer>> levelOrder(TreeNode root) {
  2. List<List<Integer>> list1=new ArrayList<>();
  3. if(root==null){
  4. return list1;
  5. }
  6. Queue<TreeNode> queue=new LinkedList<>();
  7. queue.offer(root);
  8. while(!queue.isEmpty()){
  9. int size=queue.size();
  10. List<Integer> list2=new ArrayList<>();
  11. for(int i=1;i<=size;i++){
  12. //出队列
  13. TreeNode tmp=queue.poll();
  14. if(tmp.left!=null){
  15. queue.offer(tmp.left);
  16. }
  17. if(tmp.right!=null){
  18. queue.offer(tmp.right);
  19. }
  20. list2.add(tmp.val);
  21. }
  22. list1.add(list2);
  23. }
  24. return list1;
  25. }

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

闽ICP备14008679号