day12二叉树的层序遍历&翻转二叉树&对称二叉树(递归详解版)

目录

二叉树的层序遍历(力扣102)

 2.翻转二叉树(力扣226)

 3.对称二叉树(力扣101)

1.二叉树的层序遍历(力扣102)

        二叉树的层序遍历是借助队列来实现,首先讲根节点放入队列中,然后进行循环遍历操作,接着我们把根节点拿出队列,再拿出队列的同时讲弹出节点的孩子节点以此入队列,如此循环直到队列为空,停止遍历。看下动态图来模拟以下过程

代码实现:
 

    public List> levelOrder(TreeNode root) {
            List>  res = new ArrayList();
            if(root==null){
                return res;
            }
            Queue queue = new LinkedList();
            //根节点入队
            queue.offer(root);
            while(!queue.isEmpty()){
                List temp = new ArrayList();
                int size = queue.size();
                //讲每一层的节点都遍历完全
                while(size>0){
                    TreeNode node = queue.poll();
                    temp.add(node.val);
                    if(node.left!=null){
                        queue.offer(node.left);
                    }
                    if(node.right!=null){
                        queue.offer(node.right);
                    }
                    size--;
                }
                res.add(temp);
            }
            return res;
    }

 2.翻转二叉树(力扣226)

        本体利用递归法解决很方便,我们再解决树问题时,需要选对正确的遍历过程,本题利用前序遍历或后序遍历会很方便解决。(前序遍历)

                

        再开始之前我们要确定递归的三个条件

  • 参数和返回值:我们是对节点的左右孩子进行操作,所以我们传入一个节点;最终返回根节点
TreeNode invertTree(TreeNode root)
  • 确定终止条件:当前节点为空的时候,就返回
if (root == NULL) return root;
  • 确定单层递归的逻辑:因为是先前序遍历,所以先进行交换左右孩子节点,然后反转左子树,反转右子树。
        root =  swap(root);
        invertTree(root.left);
        invertTree(root.right);

代码如下:

     public TreeNode invertTree(TreeNode root) {
        if(root==null){
            return null;
        }
        root =  swap(root);
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
    public TreeNode swap(TreeNode root){
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        return root;
    }

 3.对称二叉树(力扣101)

        本题利用递归解决,依次比较外侧节点和内侧节点的值及孩子节点。本题利用递归三步骤来解决。

1.确定递归函数的参数和返回值:我们比较的是根节点的左右子树,所以参数也为两个子树

2.确定终止条件:终止条件有好多种:

  • 左节点为空,右节点不为空,不对称,return false
  • 左不为空,右为空,不对称 return false
  • 左右都为空,对称,返回true
  • 左右都不为空,比较节点数值,不相同就return false

3.确定单层递归的逻辑:

  • 判断根节点左子树的左节点根节点右子树的右节点是否相等
  • 判断根节点左子树的右节点根节点右子树的左节点是否相等
  • 最终判断左右子树是否相等

代码实现:

    public boolean isSymmetric(TreeNode root) {
        if(root==null){
            return true;
        }
        return compare(root.left,root.right);
    }
    boolean compare(TreeNode left,TreeNode right){
        if(left!=null&&right==null){
            return false;
        }else if(left==null&&right!=null){
            return false;
        }else if(left==null&&right==null){
            return true;
        }else if(left.val!=right.val){
            return false;
        }
        boolean out = compare(left.left,right.right);
        boolean in = compare(left.right,right.left);
        boolean res = out&∈
        return res;
    }

你可能感兴趣的:(代码随想录,数据结构,算法,leetcode,java)