计算三叉搜索树的高度

题目描述

定义构造三叉搜索树规则如下:

每个节点都存有一个数, 当插入一个新的数时, 从根节点向下寻找, 直到找到一个合适的空节点插入.

查找的规则是:

  • 如果数小于节点的数减去500, 则将数插入节点的左子树
  • 如果数大于节点的数加上500, 则将数插入节点的右子树
  • 否则, 将数插入节点的中子树

给你一系列数, 请按以上规则, 按顺序将数插入树中, 构建出一棵三叉搜索树, 最后输出树的高度.

输入描述

第一行为一个数 N, 表示有 N 个数, 1 ≤ N ≤ 10000

第二行为 N 个空格分隔的整数, 每个数的范围为 [1,10000]

输出描述

输出树的高度 (根节点的高度为1)

示例1

输入:

5
5000 2000 5000 8000 1800

输出:

3

说明:

input1

示例2

输入:

3
5000 4000 3000

输出:

3

说明:

input2

示例3

输入:

9
5000 2000 5000 8000 1800 7500 4500 1400 8100

输出:

4

说明:

input3

题解

Python


class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.middle = None
        self.right = None

    # 向当前节点的子节点插入新的值
    # 如果当前节点的子节点不存在, 就创建它
    # 如果对应的子节点已经存在, 就在子节点中完成插入操作
    def insert(self, value):
        if self.value - value > 500:
            # 去左子节点
            if self.left:
                self.left.insert(value)
            else:
                self.left = TreeNode(value)
        elif value - self.value > 500:
            # 去右子节点
            if self.right:
                self.right.insert(value)
            else:
                self.right = TreeNode(value)
        else:
            # 去中间子节点
            if self.middle:
                self.middle.insert(value)
            else:
                self.middle = TreeNode(value)

# 构造三叉搜索树
def build_tree(array: list[int]) -> TreeNode:
    # 创建根节点
    root = TreeNode(array[0])
    for value in array[1:]:
        root.insert(value)
    return root

# 递归访问所有节点
def tree_height(root: TreeNode) -> int:
    if not root:
        return 0
    left_height = tree_height(root.left)
    middle_height = tree_height(root.middle)
    right_height = tree_height(root.right)
    child_height = max(left_height, middle_height, right_height)
    return 1 + child_height

def main():
    # 读取输入
    # 读取节点个数
    num_nodes = int(input())
    assert 1 <= num_nodes <= 10000
    # 读取所有节点的值, 存放到数组
    array = list(map(int, input().split()))
    assert len(array) == num_nodes

    # 构造三叉树
    root = build_tree(array)

    # 获取树的最大高度
    height = tree_height(root)

    # 打印结果
    print(height)

if __name__ == "__main__":
    main()

Rust

use std::io::{stdin, BufRead};

pub struct TreeNode {
    value: i32,
    left: Option<Box<Self>>,
    middle: Option<Box<Self>>,
    right: Option<Box<Self>>,
}

impl TreeNode {
    pub fn new(value: i32) -> Self {
        Self {
            value,
            left: None,
            middle: None,
            right: None,
        }
    }

    fn boxed_new(value: i32) -> Option<Box<Self>> {
        Some(Box::new(Self {
            value,
            left: None,
            middle: None,
            right: None,
        }))
    }

    // 向当前节点的子节点插入新的值
    // 如果当前节点的子节点不存在, 就创建它
    // 如果对应的子节点已经存在, 就在子节点中完成插入操作
    pub fn insert(&mut self, value: i32) {
        if self.value - value > 500 {
            // 去左子节点
            if let Some(left) = &mut self.left {
                left.insert(value);
            } else {
                self.left = Self::boxed_new(value);
            }
        } else if value - self.value > 500 {
            // 去右子节点
            if let Some(right) = &mut self.right {
                right.insert(value);
            } else {
                self.right = TreeNode::boxed_new(value);
            }
        } else {
            // 去中间子节点
            if let Some(middle) = &mut self.middle {
                middle.insert(value);
            } else {
                self.middle = TreeNode::boxed_new(value);
            }
        }
    }
}

// 构造三叉搜索树
fn build_tree(array: &[i32]) -> TreeNode {
    assert!(!array.is_empty());

    // 创建根节点
    let mut root = TreeNode::new(array[0]);
    for &value in &array[1..] {
        root.insert(value);
    }
    root
}

// 递归访问所有节点
fn tree_height(root: &Option<Box<TreeNode>>) -> usize {
    if let Some(root) = root.as_ref() {
        let left_height = tree_height(&root.left);
        let middle_height = tree_height(&root.middle);
        let right_height = tree_height(&root.right);
        let child_height = left_height.max(middle_height.max(right_height));
        1 + child_height
    } else {
        0
    }
}

fn main() {
    // 读取输入
    // 读取节点个数
    let mut line = String::new();
    let ret = stdin().lock().read_line(&mut line);
    assert!(ret.is_ok());
    let num_nodes: usize = line.trim().parse().unwrap();
    assert!((1..=10000).contains(&num_nodes));

    // 读取所有节点的值, 存放到数组
    line.clear();
    let ret = stdin().lock().read_line(&mut line);
    assert!(ret.is_ok());
    let array: Vec<i32> = line
        .trim()
        .split_ascii_whitespace()
        .map(|s| s.parse().unwrap())
        .collect();
    assert_eq!(array.len(), num_nodes);

    // 构造三叉树
    let root = build_tree(&array);
    let root = Some(Box::new(root));

    // 获取树的最大高度
    let height: usize = tree_height(&root);

    // 打印结果
    println!("{height}");
}