力扣_树

二叉树的最大深度

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 //深度优先遍历
 //方法可以参考一棵只有三个节点的树(完全二叉树)
// class Solution {
//     public int maxDepth(TreeNode root) {
//         if(root == null){
//             return 0;
//         }else{
//             int leftmax = maxDepth(root.left);
//             int rightmax = maxDepth(root.right);
//             //返回到左右子树的父节点,要求最高树,因此要返回左右子树高度的最大值并且高度要加1
//             return Math.max(leftmax,rightmax) + 1; 
//         }
//     }
// }

//广度优先遍历
//按照层次遍历,每遍历一层高度加1
//遍历的过程中要将每层的下一层的所有的节点存入在队列中
class Solution {
    public int maxDepth(TreeNode root) {
        //特殊情况
        if(root == null){
            return 0;
        }
        //高度
        int high = 0;
        //设置队列,队列Queue的存入是offer,取出是poll
        Queue<TreeNodequeue = new LinkedList<TreeNode>();
        //从根节点开始
        queue.offer(root);
        //循环结束的条件是队列为空
        while(!queue.isEmpty()){
            //每一层的节点个数
            int size = queue.size();
            while(size > 0){
                TreeNode node = queue.poll();
                //先判断node指针的左右节点是否为空再判断是否是要存,不然会出现空指针异常
                 if(node.left != null){
                    queue.offer(node.left);
                 }
                 if(node.right != null){
                     queue.offer(node.right);
                 }
                --size;
            }
            ++high;
        }
        return high;
    }
}
 
 

验证二叉搜索树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 //这题可以用中序遍历先将树的值都存下来,这里建议用队列
 //然后判断队列是否后一项的值大于前一项的,如果中间存在不是后一项大于前一项,则不是二叉搜索树
// class Solution {
//     public boolean isValidBST(TreeNode root) {
//         Queue<TreeNode> queue = null;
//         queue = isOrderTraversal(root);
//         //求队列的长度
//         int length = queue.size();
//         //判断是否前一项的值小于后一项的值
//         while(!queue.isEmpty()){
//             TreeNode t1 = queue.poll();
//             int t11 = t1.val;
//             TreeNode t2 = queue.poll();
//             int t22 = t2.val;
//             if(t11 > t22){
//                 return false;
//             }
//         }
//         return true;
//     }

//     //中序遍历
//     public Queue<TreeNode> isOrderTraversal(TreeNode node){
//         //设置队列用于保存中序遍历过程中存下的值
//         Queue<TreeNode> queue = new LinkedList<TreeNode>();
//         if(node == null){
//             return null;
//         }else{
//             isOrderTraversal(node.left);
//             queue.offer(node);
//             isOrderTraversal(node.right);
//         }
//         return queue;
//     }
// }

//不使用递归的中序遍历
class Solution {
    public boolean isValidBST(TreeNode root) {
        Deque<TreeNodestack = new LinkedList<TreeNode>();
        double cur = -Double.MAX_VALUE;
        while(root != null || !stack.isEmpty()){
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            //必须带等号
            if(root.val <= cur){
                return false;
            }
            cur = root.val;
            root = root.right;
        }
        return true;
    }
}
 

对称二叉树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 //判断该二叉树是否为对称二叉树
 //可以设置内层判断和外层判断
 //从上往下判断,当出现任意一次不对称,则该二叉树就不是对称二叉树
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return Compare(root.left,root.right); 
    }

    //判断是否为对称二叉树
    public boolean Compare(TreeNode left,TreeNode right){
        if(left == null && right != null){
            return false;
        }
        if(left != null && right == null){
            return false;
        }
        if(left == null && right == null){
            return true;
        }
        if(left.val != right.val){
            return false;
        }
        //判断外层
        boolean out = Compare(left.left,right.right);
        //判断内层
        boolean in = Compare(left.right,right.left);
        return out && in;
    }
}
 

二叉树的层序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 //层次遍历需要注意的是每次都要将保存下来的串保存下来,是个二维的串
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //设置二维的串用于保存一维的串
        List<List<Integer>> ll = new ArrayList<List<Integer>>();
        if(root == null){
            return ll;
        }
        //设置队列用于保存一层的节点,队列Queue要和LinkedList搭配使用
        Queue<TreeNodequeue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
            //求这一层的长度
            int n = queue.size();
            //设置一维的串用于保存该层的元素值
            List<Integerl = new ArrayList<Integer>();
            while(n > 0){
                //先取出才能得到值
                TreeNode node = queue.poll();
                l.add(node.val);
                if(node.left != null){
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
                n--;
            }
            //将一维的串存入在二维的串中
            ll.add(l);
        }
        return ll;
    }
}
 
 

将有序数组转换为二叉搜索树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 //从上往下存入,每次将有序数组的中间节点当做父节点
 //父节点的左孩子为左半子树的中间节点
 //父节点的右孩子为右半子树的中间节点
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
         return dfs(nums,0,nums.length - 1);
    }

    public TreeNode dfs(int[] nums,int l,int r){
        if(l > r){
            return null;
        }
        //中间节点的值存入在树中
        int mid = (l+r)/2;
        TreeNode root = new TreeNode(nums[mid]);
        //存入中间节点的左子树节点和右子树节点
        root.left = dfs(nums,l,mid - 1);
        root.right = dfs(nums,mid + 1,r);
        return root;
    }
}
posted @ 2022-03-07 15:29  Space-guan  阅读(49)  评论(0)    收藏  举报