首页 > 其他分享 >LeetCodeHot100 二叉树 94. 二叉树的中序遍历 104. 二叉树的最大深度 101. 对称二叉树 543. 二叉树的直径 102. 二叉树的层序遍历 108. 将有序数组转

LeetCodeHot100 二叉树 94. 二叉树的中序遍历 104. 二叉树的最大深度 101. 对称二叉树 543. 二叉树的直径 102. 二叉树的层序遍历 108. 将有序数组转

时间:2024-03-31 15:11:34浏览次数:26  
标签:node right return 二叉 搜索 二叉树 TreeNode root left

94. 二叉树的中序遍历
https://leetcode.cn/problems/binary-tree-inorder-traversal/description/?envType=study-plan-v2&envId=top-100-liked

//    递归
//    List<Integer> resList;
//    public List<Integer> inorderTraversal(TreeNode root) {
//        resList = new ArrayList<>();
//        inorderHelper(root);
//        return resList;
//    }
//    public void inorderHelper(TreeNode node){
//        if (node == null) return;
//        inorderHelper(node.left);
//        resList.add(node.val);
//        inorderHelper(node.right);
//    }
//迭代
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> resList = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        while (root != null || !deque.isEmpty()){
            if (root != null){
                deque.addLast(root);
                root = root.left;
            }else {
                root = deque.pollLast();
                resList.add(root.val);
                root = root.right;
            }
        }
        return resList;
    }

104. 二叉树的最大深度
https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/?envType=study-plan-v2&envId=top-100-liked

public int maxDepth(TreeNode root) {
        return max(root);
    }
    public int max(TreeNode node){
        if (node == null) return 0;
        int left = max(node.left);
        int right = max(node.right);
        return Math.max(left,right) + 1;
    }

总结:后序遍历 需要左右子树的信息。左右最深者+1
226. 翻转二叉树
https://leetcode.cn/problems/invert-binary-tree/?envType=study-plan-v2&envId=top-100-liked

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

总结:前序遍历,每次交换左和右
101. 对称二叉树
https://leetcode.cn/problems/symmetric-tree/description/?envType=study-plan-v2&envId=top-100-liked

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 in && out;
    }

总结:递归函数要两个节点,两个节点就是要比对的节点,前序,每次结束之后都去看外侧和内侧。
543. 二叉树的直径
https://leetcode.cn/problems/diameter-of-binary-tree/description/?envType=study-plan-v2&envId=top-100-liked

int diameter;
    public int diameterOfBinaryTree(TreeNode root) {
        diameter = 0;
        diameterHelper(root);
        return diameter;
    }
    public int diameterHelper(TreeNode node){
        if (node == null) return 0;
        int depthLeft = diameterHelper(node.left);
        int depthRight = diameterHelper(node.right);
        diameter = Math.max(depthLeft + depthRight,diameter);
        return Math.max(depthLeft,depthRight) + 1;
    }

总结:后序,每个节点当前的直径就是当前的左子树深度+右子树深度。
102. 二叉树的层序遍历
https://leetcode.cn/problems/binary-tree-level-order-traversal/description/?envType=study-plan-v2&envId=top-100-liked

public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> resList = new ArrayList<>();
        Deque<TreeNode> deque = new LinkedList<>();
        if (root == null) return resList;
        deque.addLast(root);
        while (!deque.isEmpty()){
            int len = deque.size();
            List<Integer> tempList = new ArrayList<>();
            for (int i = 0; i < len; i++) {
                TreeNode node = deque.pollFirst();
                tempList.add(node.val);
                if (node.left != null) deque.addLast(node.left);
                if (node.right != null) deque.addLast(node.right);
            }
            resList.add(new ArrayList<>(tempList));
        }
        return resList;
    }

总结:。。。
108. 将有序数组转换为二叉搜索树
https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/?envType=study-plan-v2&envId=top-100-liked

public TreeNode sortedArrayToBST(int[] nums) {
        return helper(nums,0,nums.length-1);
    }
    public TreeNode helper(int[] nums,int start,int end){
        if (start > end) return null;
        int mid = start + (end - start) / 2;
        TreeNode treeNode = new TreeNode(nums[mid]);
        treeNode.left = helper(nums,start,mid - 1);
        treeNode.right = helper(nums,mid + 1,end);
        return treeNode;
    }

总结:二分查找去构造新节点。
98. 验证二叉搜索树
https://leetcode.cn/problems/validate-binary-search-tree/description/?envType=study-plan-v2&envId=top-100-liked

TreeNode pre = null;
    public boolean isValidBST(TreeNode root) {
        if (root == null) return true;
        boolean left = isValidBST(root.left);
        if (left == false) return false;
        if (pre != null && root.val <= pre.val){
            return false;
        }
        pre = root;
        boolean right = isValidBST(root.right);
        return right;
    }

总结:我们知道二叉搜索树的中序遍历是从小到大,那只要中序遍历的时候每次看当前节点和前一个节点的值是否满足当前节点>上一个几点即可判断是不是二叉搜索树。
230. 二叉搜索树中第K小的元素
https://leetcode.cn/problems/kth-smallest-element-in-a-bst/description/?envType=study-plan-v2&envId=top-100-liked

    int res = 0;
    int k;
    public int kthSmallest(TreeNode root, int k) {
        this.k = k;
        inorder(root);
        return res;
    }
    public void inorder(TreeNode node){
        if (node == null) return;
        inorder(node.left);
        if (k == 1) {
            res = node.val;
            k--;
            return;
        }else {
            k--;
        }
        inorder(node.right);
    }

总结:指定一个计数器,每然后中序遍历,到计数器的时候就放进res中
199. 二叉树的右视图
https://leetcode.cn/problems/binary-tree-right-side-view/description/?envType=study-plan-v2&envId=top-100-liked

public List<Integer> rightSideView(TreeNode root) {
        List<Integer> resList = new ArrayList<>();
        if (root == null) return resList;
        Deque<TreeNode> deque = new LinkedList<>();
        deque.addLast(root);
        while (!deque.isEmpty()){
            int len = deque.size();
            for (int i = 0; i < len; i++) {
                TreeNode treeNode = deque.pollFirst();
                if (i == len - 1) resList.add(treeNode.val);
                if (treeNode.left != null) deque.addLast(treeNode.left);
                if (treeNode.right != null) deque.addLast(treeNode.right);
            }
        }
        return resList;
    }

总结:层序遍历,拿每层的最后一个。
114. 二叉树展开为链表
https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/?envType=study-plan-v2&envId=top-100-liked

public void flatten(TreeNode root) {
		if(root==null) {
			return;
		}
		LinkedList<TreeNode> res = new LinkedList<TreeNode>();
		//前序遍历整棵二叉树
		dfs(root,res);
		TreeNode head = res.removeFirst();
		head.left = null;
		//遍历链表,将链表中的TreeNode节点前后串联起来
		while(res.size()>0) {
			TreeNode tmp = res.removeFirst();			
			tmp.left = null;
			head.right = tmp;
			head = head.right;
		}	
	}
	
	//前序遍历整棵二叉树,并将遍历的结果放到数组中
	void dfs(TreeNode root, List<TreeNode> res) {
		if(root==null) {
			return;
		}
		res.add(root);
		dfs(root.left,res);
		dfs(root.right,res);
	}

总结:先序遍历每个节点,存下来,再操作。

标签:node,right,return,二叉,搜索,二叉树,TreeNode,root,left
From: https://www.cnblogs.com/jeasonGo/p/18106753

相关文章

  • 搜索与图论(三)树与图的深度优先遍历---以题为例
    给定一颗树,树中包含 n个结点(编号 1∼n)和 n−1 条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。输入格式第一行包含整数 n,......
  • 20240331_搜索练习
    目录P3206DungeonMasterP3207LakeCountingP3208TheCastleP896仙岛求药P429【基础】走迷宫P2465迷宫问题P952【入门】算24点P3206DungeonMaster这题是一个三维迷宫,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次......
  • DFS(基础,回溯,剪枝,记忆化)搜索
    DFS基础DFS(深度优先搜索)基于递归求解问题,而针对搜索的过程对于问题的介入状态叫初始状态,要求的状态叫目标状态这里的搜索就是对实时产生的状态进行分析检测,直到得到一个目标状态或符合要求的最佳状态为止。对于实时产生新的状态的过程叫扩展搜索的要点:1.选定初始状态,......
  • L2-004 这是二叉搜索树吗?
    这种题边界真的是每次都搞不清楚,我感觉现场估计也写不出来。#include<bits/stdc++.h>usingnamespacestd;constintN=1010;intismirror;intpre[N];vector<int>post;voiddfs(introot,inttail){//最后一个 if(root>tail)return; inti=root+1; intj......
  • L2-011 玩转二叉树
    和L2-006是一样的。正常建树,只是在BFS的时候先放右儿子。L2-006树的遍历https://www.cnblogs.com/chengyiyuki/p/18106375代码:#include<bits/stdc++.h>usingnamespacestd;constintN=40;intpre[N],in[N];intL[N],R[N];intbuild(intal,intar,intbl,int......
  • java数据结构与算法刷题-----LeetCode95. 不同的二叉搜索树 II
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录分治回溯+记忆化搜索分治回溯+记忆化搜索卡特兰数,例如对于n个进栈元素,有多少种出栈顺序,......
  • PHP 跳转搜索(Jump Search)
            与二分搜索一样,跳转搜索是一种针对排序数组的搜索算法。基本思想是通过按固定步骤向前跳跃或跳过某些元素来代替搜索所有元素来检查更少的元素(比线性搜索)。例如,假设我们有一个大小为n的数组arr[]和一个大小为m的块(要跳转)。然后我们在索引arr[0]、arr[m]......
  • 搜索引擎语法
    百度语法1.搜索A屏蔽B【A-B】这里的'-'前要有空格2.搜索包含A的信息或者包含B的信息【A|B】3.将搜索范围限定在网页标题【Aintitle:B】也就是必须有A且B的内容必须出现在标题中;'intitle:'后不能有空格4.将搜索范围界定在指定网站中【Asite:站点域名】也就是站点域名......
  • 2023最新293TV v6.2 APP源码 神马TV影视APP源码可对接易支付 修复搜索附安装教程
    神马TV影视APP源码可对接易支付修复搜索附安装教程源码简介2023最新版本293TV、神马tv源码6.2版本修复首字母拼音搜索支持所有易支付解决6.2版本通病自动巡检删除后台文件JSON和api解析后台随意设置总共有5套后台:中控后台,会员后台,苹果CMS后台,反馈后台,解析后台,会员......
  • LC 104.二叉树的最大深度
    104.二叉树的最大深度给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。示例1:输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2提示:树中节点的数量在......