首页 > 试题广场 >

判断一棵二叉树是否为搜索二叉树和完全二叉树

[编程题]判断一棵二叉树是否为搜索二叉树和完全二叉树
  • 热度指数:53280 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一棵二叉树,已知其中的节点没有重复值,请判断该二叉树是否为搜索二叉树和完全二叉树。
输出描述:分别输出是否为搜索二叉树、完全二叉树。


数据范围:二叉树节点数满足 ,二叉树上的值满足
要求:空间复杂度 ,时间复杂度

注意:空子树我们认为同时符合搜索二叉树和完全二叉树。
示例1

输入

{2,1,3}

输出

[true,true]
示例2

输入

{1,#,2}

输出

[true,false]

说明

由于节点的右儿子大于根节点,无左子树,所以是搜索二叉树但不是完全二叉树     
示例3

输入

{}

输出

[true,true]

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
/**
 * #[derive(PartialEq, Eq, Debug, Clone)]
 * pub struct TreeNode {
 *     pub val: i32,
 *     pub left: Option<Box<TreeNode>>,
 *     pub right: Option<Box<TreeNode>>,
 * }
 *
 * impl TreeNode {
 *     #[inline]
 *     fn new(val: i32) -> Self {
 *         TreeNode {
 *             val: val,
 *             left: None,
 *             right: None,
 *         }
 *     }
 * }
 */
struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param root TreeNode类 the root
        * @return bool布尔型一维数组
    */
    pub fn judgeIt(&self, root: Option<Box<TreeNode>>) -> Vec<bool> {
        if root.is_none() {return vec![true, true]}
        // write code here
        vec![self.isBST(&root).is_some(), self.isCBT(&root)]
    }
    fn isBST(&self, bt: &Option<Box<TreeNode>>) -> Option<(i32, i32)> {
        if bt.is_none() {return None}
        let m = self.getVal(&bt);
        let mut max = m;
        let mut min = m;
        if bt.as_ref().unwrap().left.is_some() {
            let lmax = self.isBST(&bt.as_ref().unwrap().left);
            if lmax.is_none() || lmax.as_ref().unwrap().1 > m {return None}
            min = lmax.unwrap().0
        }
        if bt.as_ref().unwrap().right.is_some() {
            let rmin = self.isBST(&bt.as_ref().unwrap().right);
            if rmin.is_none() || rmin.as_ref().unwrap().0 < m {return None}
            max = rmin.unwrap().1
        }

        Some((min, max))
    }
    fn getVal(&self, node: &Option<Box<TreeNode>>) -> i32 {
        node.as_ref().unwrap().val
    }
    fn isCBT(&self, bt: &Option<Box<TreeNode>>) -> bool {
        let mut level_node_num = 1; //非最底层节点数满足 2^N
        use std::collections::VecDeque;
        let mut q = VecDeque::new();
        q.push_back(bt);
        let mut end = false; //最底下一层结点必须靠左
        //层序遍历
        while q.len() > 0 {
            let _t = q.len();
            if _t == level_node_num {
                for _ in 0 .. _t {
                    let node = q.pop_front().unwrap();
                    if node.as_ref().unwrap().left.is_some() {
                        if end {return false}
                        q.push_back(&node.as_ref().unwrap().left);
                    } else {
                        end = true;
                    }
                    if node.as_ref().unwrap().right.is_some() {
                        if end {return false}
                        q.push_back(&node.as_ref().unwrap().right);
                    } else {
                        end = true;
                    }
                }
                level_node_num *= 2;
            } else {
                // 最底下一层结点不存在左右孩子
                for _ in 0 .. _t {
                    let node = q.pop_front().unwrap();
                    if node.as_ref().unwrap().left.is_some() {
                        return false
                    }
                    if node.as_ref().unwrap().right.is_some() {
                        return false
                    }
                }
            }
        }
        true
    }
}

发表于 2024-06-16 22:26:26 回复(0)