vlambda博客
学习文章列表

[Every Day Question 5.2] 每日一题 - 力扣 110.平衡二叉树 和 98. 验证二叉搜索树

验证二叉搜索树

难度:中等 Medium (35.96%)

问题描述

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:

  1. 节点的左子树只包含 小于 当前节点的数。

  2. 节点的右子树只包含 大于 当前节点的数。

  3. 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

[Every Day Question 5.2] 每日一题 - 力扣 110.平衡二叉树 和 98. 验证二叉搜索树

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
树中节点数目范围在[1, 104] 内
-231 <= Node.val <= 231 - 1

算法思路

二叉搜索树具备其中序遍历是递增序列,可以先对root节点进行一遍中序遍历,存放到list中,再对list顺序遍历,如果有一对数值为逆序且相等,则说明其不是二叉搜索树。也可以使用一个栈进行中序遍历操作和一个数值记录当前最大值,如果当前最大值小于栈顶,则返回false。

代码实现 Java语言

    /*
* @lc app=leetcode.cn id=98 lang=java
*
* [98] 验证二叉搜索树,方法1
*/

// @lc code=start
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 {
List<Integer> list = new ArrayList<>();
public boolean isValidBST(TreeNode root) {
inorder(root);
for (int i = 1; i < list.size(); i++){
System.out.println(list.get(i - 1) + " " + list.get(i));
if (list.get(i) <= list.get(i - 1)){
return false;
}
}
return true;
}
void inorder(TreeNode root1){

if (root1 == null){
return;
}
inorder(root1.left);
list.add(root1.val);
inorder(root1.right);
}


}
// 方法二
class Solution {
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
long pre = Long.MIN_VALUE;

while (cur != null || !stack.isEmpty()){
while (cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
if (cur.val <= pre){
return false;
}
pre = cur.val;
cur = cur.right;
}

return true;
}

}

算法复杂度分析

时间复杂度 O(n) , 对于方法一 n个节点的树,每个节点最大可能被访问两次,为O(2n),复杂度为O(n)数量级,对于方法二,每个节点最大可能被访问1次,为O(n)
空间复杂度O(n),对于方法一,使用了list列表和递归栈,对于方法二,仅使用一个大小为n的栈

执行效率

方法一

[Every Day Question 5.2] 每日一题 - 力扣 110.平衡二叉树 和 98. 验证二叉搜索树

方法二

[Every Day Question 5.2] 每日一题 - 力扣 110.平衡二叉树 和 98. 验证二叉搜索树

平衡二叉树

难度 Easy (56.93%)

题目描述

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

[Every Day Question 5.2] 每日一题 - 力扣 110.平衡二叉树 和 98. 验证二叉搜索树

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000] 内

  • -104 <= Node.val <= 104

算法思路

通过递归获取左子树高度和右子树高度,如果左子树高度和右子树高度之差大于1,return false,反之,继续分别求左子树和右子树是否是平衡二叉树的与

代码实现 C语言

/**
  • Definition for a binary tree node.

  • struct TreeNode {

  • int val;

  • struct TreeNode *left;

  • struct TreeNode *right;

  • };
    */

int getHeight(struct TreeNode* root){

if (root == NULL)
return 0;
int left = getHeight(root->left);
int right = getHeight(root->right);
return left > right ? left + 1 : right + 1;

}

bool isBalanced(struct TreeNode* root){

if (root == NULL) 
return true;
int left = 0; // 左子树的深度
int right = 0; // 右子树的深度
if (root->left != NULL)
left = getHeight(root->left); // 获取左子树的深度
if (root->right != NULL)
right = getHeight(root->right); // 获取右子树的深度
if (abs(left - right) > 1) // 如果左右子树的深度差大于1,则不平衡
return false;
else{
return isBalanced(root->left) && isBalanced(root->right);
}

}

执行效率