首页 > 其他分享 >二叉树常见题目

二叉树常见题目

时间:2024-12-14 20:20:45浏览次数:4  
标签:right return int 常见 BinaryTreeNode 二叉树 题目 root left

[Algo] 二叉树常见题目

1. 层序遍历

// 1. 层序遍历
void BFS(BinaryTreeNode *root)
{
    queue<BinaryTreeNode *> q;
    vector<BinaryTreeNode *> v;
    q.push(root);
    while (!q.empty())
    {
        while (!q.empty())
        {
            v.push_back(q.front());
            q.pop();
        }
        for (auto e : v)
        {
            cout << e->val << " ";
            if (e->left) q.push(e->left);
            if (e->right) q.push(e->right);
        }
        cout << endl;
        v.clear();
    }
}

2. 最大深度和最小深度

int maxDepth(BinaryTreeNode *root)
{
    return root == nullptr ? 0 : max(maxDepth(root->left), maxDepth(root->right)) + 1;
}
int minDepth(BinaryTreeNode *root)
{
    // 最小深度必须以叶节点作为结束
    if (root == nullptr) return 0;
    if (root->left == nullptr && root->right == nullptr) return 1;
    if (root->left == nullptr) return minDepth(root->right) + 1;
    if (root->right == nullptr) return minDepth(root->left) + 1;
    return min(minDepth(root->right), minDepth(root->left)) + 1;
}

3. 序列化与反序列化(先序)

string preOrderSerialize(BinaryTreeNode *root)
{
    if (root == nullptr) return "#,";
    return to_string(root->val) + "," + preOrderSerialize(root->left) + preOrderSerialize(root->right);
}
int curIndex = 0; // 全局遍历记录当前位置
BinaryTreeNode *preOrderDeserialize(const string &s)
{
    if (s[curIndex] == '#') { curIndex += 2; return nullptr; }
    string val_str = "";
    while (s[curIndex] != ',') val_str += s[curIndex++];
    curIndex++;
    BinaryTreeNode *root = new BinaryTreeNode(stoi(val_str));
    root->left = preOrderDeserialize(s);
    root->right = preOrderDeserialize(s);
    return root;
}

4. 由先序序列和中序序列构建二叉树

BinaryTreeNode *construct(const vector<int> &pre, int l1, int r1, const vector<int> &in, int l2, int r2, const unordered_map<int, int> &indexMap);
BinaryTreeNode *constructFromPreAndIn(const vector<int> &pre, const vector<int> &in)
{
    unordered_map<int, int> indexMap;
    for (int i = 0; i < in.size(); i++) indexMap[in[i]] = i; // 快速获取值在中序序列的位置,用于加速
    return construct(pre, 0, pre.size() - 1, in, 0, in.size() - 1, indexMap);
}
BinaryTreeNode *construct(const vector<int> &pre, int l1, int r1, const vector<int> &in, int l2, int r2, const unordered_map<int, int> &indexMap)
{
    if (l1 > r1) return nullptr;
    if (l1 == r1) return new BinaryTreeNode(pre[l1]);
    int k = indexMap.at(pre[l1]);
    BinaryTreeNode *root = new BinaryTreeNode(pre[l1]);
    root->left = construct(pre, l1 + 1, l1 + k - l2, in, l2, k - 1, indexMap);
    root->right = construct(pre, l1 + k - l2 + 1, r1, in, k + 1, r2, indexMap);
    return root;
}

5. 判断是否是完全二叉树

bool isCompleteTree(BinaryTreeNode *root)
{
    queue<BinaryTreeNode *> q;
    queue<int> index;
    int lastIndex = 0;
    q.push(root);
    index.push(1);
    while (!q.empty())
    {
        BinaryTreeNode *e = q.front();
        int curIndex = index.front();
        if (curIndex != lastIndex + 1) return false; 
        lastIndex = curIndex;
        q.pop();
        index.pop();
        if (e->left) { q.push(e->left); index.push(2 * curIndex); }
        if (e->right) { q.push(e->right); index.push(2 * curIndex + 1); }
    }
    return true;
}

6. 完全二叉树节点数

int heightBCT(BinaryTreeNode *root);
int countBCT(BinaryTreeNode *root)
{
    int height = heightBCT(root);
    if (height == 0) return 0;
    int right_height = heightBCT(root->right);
    if (right_height == height - 1) return countBCT(root->right) + (1 << right_height);
    else return countBCT(root->left) + (1 << right_height);
}
int heightBCT(BinaryTreeNode *root)
{
    int ans = 0;
    while (root != nullptr) { root = root->left; ans++; }
    return ans;
}

标签:right,return,int,常见,BinaryTreeNode,二叉树,题目,root,left
From: https://www.cnblogs.com/yaoguyuan/p/18607125

相关文章

  • 代码随想录day18 | leetcode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236
    刷题收获所有递归的写法都与正常人类想法的实现顺序相反,都是先写条件成立会发生什么再写递归成立条件通过递归调用栈实现回到上一个节点节点(恢复上一层的状态),调用栈能够记录每次递归调用的函数状态,包括函数的局部变量、参数以及函数执行到的具体位置。当递归到某个节点......
  • 近期做到的有点绕的RSA题目详解(重点:e和phi不互素)
    标题简述:内容是第一遍学,不扎实,遇到一些题目还是无法下手或者有思路有误等等ctfshow1.funnyrsa1e1=14606334023791426p1=1210097727354602353649406229894338076192119260154940874536747476143312950400636797224222982865494936981506906949651061038223153784619701......
  • 代码随想录训练营第十五天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 22
    110.平衡二叉树题目链接:110.平衡二叉树-力扣(LeetCode)讲解链接:代码随想录 求高度不是求深度高度需要从下到上(后序遍历)深度需要从上到下(先序遍历)Java代码:classSolution{publicbooleanisBalanced(TreeNoderoot){//递归做法returngetHeight......
  • 代码随想录训练营第十八天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.
     530.二叉搜索树的最小绝对差 题目链接/文章讲解:代码随想录视频讲解:二叉搜索树中,需要掌握如何双指针遍历!|LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili 注意是二叉搜索树,二叉搜索树可是有序的。给你一个二叉搜索树的根节点 root ,返回 树中任意两......
  • 安装Fedora 41系统会遇到更新和下载网络缓慢的常见问题(包含flatpak下载缓慢问题)。
    前言如果你是从Fedora官网下载的>=41以上的系统,那么这篇文章适合你。我是通过ISO进行安装的,安装完Fedora系统后。问题-解决方案如果通过dnf或者yum安装程序,下载缓慢的话,可以配置下国内的仓库源。这是aliyun的镜像Fedora仓库配置地址,可以按照文中的步骤进行配置。如果你......
  • 科丁乐K12137 二叉树中的秘密
    题目描述新年伊始,我飞买了一棵二叉树,传闻这棵二叉树的某一个节点上隐藏着上古的秘密,于是我飞开始昼夜不息的寻找。本着不遗漏任何一个节点的原则,飞神打算遍历整棵二叉树。设S为飞神当前所处的节点。若S有两个子节点L,R,则飞神总是先去遍历节点较少的那棵子树,然后再去遍历另......
  • C# 面试常见递归算法
    前言今天我们主要总结一下C#面试中常见递归算法。C#递归算法计算阶乘的方法一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。原理:亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以递归方式定义......
  • 开拓计划4 - 二叉树与并查集
    开拓计划4-二叉树与并查集二叉树二叉树的概念Q:什么是树?A:一种有\(n\)个节点最多有\(n-1\)条边的图。Q:什么是二叉树?A:每个节点都最多只有两个子节点的树。二叉树和递归Q:二叉树和递归有什么关系?A:在执行递归的时候总是会自己调用自己,每一次调用都会产生新的一层,新......
  • Java方法调用经典题目练习
    一.简答题(共15题,100.0分)1.编写一个方法,返回两个参数的和。提示:方法的原型如下:doublesum(doublex,doubley)(5.0分)2.编写一个方法,返回三个参数中的最大值。提示:方法的原型如下:doublemax(doublex,doubley,doublez)(5.0分)3.编写一个方法,判断参数是否是奇......
  • 代码随想录训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 9
    654.最大二叉树  题目链接/文章讲解:代码随想录视频讲解:又是构造二叉树,又有很多坑!|LeetCode:654.最大二叉树_哔哩哔哩_bilibili创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组......