美文网首页算法
二叉树的遍历

二叉树的遍历

作者: 小鱼嘻嘻 | 来源:发表于2020-10-23 23:39 被阅读0次

问题1

二叉树的前序遍历,递归和非递归

原理

  • 根左右

代码

class Solution {
    List<Integer> list  = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
      if(root==null){
          return list;
      }
      list.add(root.val);
      preorderTraversal(root.left);
      preorderTraversal(root.right);
      return list;
    }
}
class Solution {
    List<Integer> list  = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
      if(root==null){
          return list;
      }
      Stack<TreeNode> stack = new Stack<>();
      stack.add(root);
      while(!stack.isEmpty()){
          list.add(stack.peek().val);
          TreeNode cur = stack.pop();
          if(cur.right!=null){
              stack.add(cur.right);
          }
          
          if(cur.left!=null){
              stack.add(cur.left);
          }
      }
      return list;
    }
}

注意事项

  • 牢记二叉树的遍历口诀,前序根左右,中序左根右,后序左右根。

问题2

二叉树的中序遍历,递归和非递归

原理

  • 中序左根右

代码

class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        
        if(root==null){
            return list;
        }
        inorderTraversal(root.left);
        list.add(root.val);
        inorderTraversal(root.right);
       
        return list;
    }

}
class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        
        if(root==null){
            return list;
        }
        Stack<TreeNode> stack = new Stack<>();
       TreeNode cur = root;

       while(cur!=null||!stack.isEmpty()){
           while(cur!=null){
               stack.add(cur);
               cur = cur.left;
           }
            TreeNode mid =  stack.pop();
            list.add(mid.val);
            cur = mid.right;
           
       }
        return list;
    }

}

注意事项

问题3

二叉树的后序遍历,递归和非递归

原理

  • 左右根

代码

class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> postorderTraversal(TreeNode root) {
        
        if(root==null){
            return list;
        }

        postorderTraversal(root.left);
        postorderTraversal(root.right);
        list.add(root.val);

        return list;
    }
}
class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> postorderTraversal(TreeNode root) {
        
        if(root==null){
            return list;
        }

        Stack<TreeNode>  stack = new Stack<>();
        stack.add(root);
        while(!stack.isEmpty()){
            TreeNode cur = stack.pop();
            if(cur.left!=null){
                stack.add(cur.left);
            }
            if(cur.right!=null){
                stack.add(cur.right);
            }
            list.add(cur.val);
        }

        Collections.reverse(list);

        return list;
    }
}

注意事项

  • 先按照左右根入栈,出来的顺序应该是根右左
  • 然后把根右左reverse,变成左右根。

问题4

二叉树的层序遍历,递归和非递归

原理

  • 先进先出,自然想到队列。
  • 按照层迭代。

代码

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>>  list = new ArrayList<>();
        if(root==null){
            return list;
        }
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()){
            int size = q.size();
            List<Integer> clist = new ArrayList<>();
            for(int i=0;i<size;i++){
                 TreeNode cur = q.poll();
                if(cur.left!=null){
                    q.add(cur.left);
                }
                if(cur.right!=null){
                    q.add(cur.right);
                }
                clist.add(cur.val);
            }
           
            list.add(new ArrayList<>(clist));
        }
        return list;
    }
}

注意事项

  • 处理每一层的元素需要使用循环。

问题5

二叉树的之字形遍历,递归和非递归

原理

  • 原理和问题5一致,就是考虑一下奇偶问题就好了。

代码

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>>  res = new ArrayList<>();
         if(root==null){
             return res;
         }
         Queue<TreeNode> q = new LinkedList<>();
         q.add(root);
         int count = 0;
         while(!q.isEmpty()){
             int size = q.size();
             LinkedList<Integer> clist = new LinkedList<>();
             for(int i=0;i<size;i++){
                 TreeNode cur = q.poll();
                 if(cur.left!=null){
                     q.add(cur.left);
                 }
                 if(cur.right!=null){
                     q.add(cur.right);
                 }
                 if(count%2==0){
                     clist.addLast(cur.val);
                 }else{
                     clist.addFirst(cur.val);
                 }
             }
             res.add(new LinkedList<>(clist));
             count++;
         }
         return res;
    }
}

注意事项

  • 采用一个变量count来记录是odd还是even。
  • 使用linkedlist的特性,addlast or addFirst

相关文章

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 二叉树三种遍历Swift代码实现

    二叉树的三种遍历 二叉树 前序遍历 中序遍历 后序遍历 另外 不得不说,得到二叉树的前序遍历和中序遍历的结果或者后...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

  • 二叉树的遍历

    二叉树的遍历 二叉树遍历 分为前序遍历、中序遍历和后序遍历。 前序遍历 (DLR) 先访问根节点,然后前序遍历左子...

  • 数据结构:树的实现和遍历(c++)

    (一)二叉树的遍历——递归实现 二叉树常见的遍历方式分为前序遍历、中序遍历和后序遍历。 1 前序遍历 前序遍历也叫...

  • 二叉树的蛇形层次遍历(LeetCode.103)

    题目 解析 首先参考二叉树的层次遍历层次遍历二叉树(LeetCode--102二叉树的层次遍历)[https://...

  • 算法精选题总结之二叉树类

    1.二叉树的中序遍历中序遍历的迭代方法中序遍历的递归方法2.二叉树前序遍历3.二叉树后续遍历4.二叉树的最近公共祖...

网友评论

    本文标题:二叉树的遍历

    本文链接:https://www.haomeiwen.com/subject/dnvbmktx.html