二叉树(下)

,二叉树算法题

1.单值二叉树

代码:

cpp 复制代码
bool isUnivalTree(struct TreeNode* root) {
    if(root == NULL)
    {
        return true;
    }
    if(root->left&&root->val!=root->left->val)
    {
        return false;
    }
    if(root->right&&root->val!=root->right->val)
    {
        return false;
    }
    return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

原理图:

二叉树的左右子树里的值如果相同,返回true,则返回false

运行结果:

提交结果:

2.相同的树

代码:

cpp 复制代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL&&q == NULL)
    {
        return true;
    }
    if(p == NULL || q == NULL)
    {
        return false;
    }
    if(p->val != q->val)
    {
        return false;
    }
    return isSameTree(p->left,q->left)&& isSameTree(p->right,q->right);
}

原理图:

如果两个二叉树结构和数值相同返回true,否则返回flase

true:

flase:

运行结果:

提交结果:

3.对称二叉树

代码:

cpp 复制代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL&&q == NULL)
    {
        return true;
    }
    if(p == NULL || q == NULL)
    {
        return false;
    }
    if(p->val != q->val)
    {
        return false;
    }
    return isSameTree(p->left,q->right) && isSameTree(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root) {
    return isSameTree(root->left,root->right);
}

原理:

检查左右子树是否对称,对称返回true,不对称则返回false

运行结果:

提交结果:

4.另一棵树的子树

代码:

cpp 复制代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL&&q == NULL)
    {
        return true;
    }
    if(p == NULL || q == NULL)
    {
        return false;
    }
    if(p->val != q->val)
    {
        return false;
    }
    return isSameTree(p->left,q->left)&& isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {
    if(root == NULL)
    {
        return false;
    }
 if(isSameTree(root,subRoot))
 {
    return true;
 }   
 return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}

原理图:

检查二叉树有没有相同的子树,如果有返回true,没有返回false

true:

false:

运行结果:

提交结果:

5.前序遍历

代码:

cpp 复制代码
typedef struct TreeNode TreeNode;
int treeSize(TreeNode*root)
{
    if(root == NULL)
    {
        return 0;
    }
    return 1 + treeSize(root->left) + treeSize(root->right);
}
void prtorder(TreeNode*root,int*arr,int* pi)
{
    if(root == NULL)
    {
        return;
    }
    arr[(*pi)++] = root->val;
    prtorder(root->left,arr,pi);
    prtorder(root->right,arr,pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = treeSize(root);
    int* arr = (int*)malloc(sizeof(int)*(*returnSize));
    int i = 0;
    prtorder(root,arr,&i);
    return arr;
}

原理:

先找出二叉树中有多少个节点,申请完内存空间后再进行前序遍历

运行结果:

提交结果:

6.中序遍历

代码:

cpp 复制代码
typedef struct TreeNode TreeNode;
int treeSize(TreeNode* root)
{
    if(root == NULL)
    {
        return 0;
    }
    return 1 + treeSize(root->left) + treeSize(root->right);
}

void inorder(TreeNode* root,int *arr,int *pi)
{
    if(root == NULL)
    {
        return;
    }
    inorder(root->left,arr,pi);
    arr[(*pi)++] = root->val;
    inorder(root->right,arr,pi);
}


int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = treeSize(root);
    int *arr = (int*)malloc(sizeof(int)*(*returnSize));
    int i = 0;
    inorder(root,arr,&i);
    return arr;
}

原理:

先找出二叉树中有多少个节点,申请完内存空间后再进行中序遍历

运行结果:

提交结果:

7.后续遍历

代码:

cpp 复制代码
typedef struct TreeNode TreeNode;
int treeSize(TreeNode*root)
{
    if(root == NULL)
    {
        return 0;
    }
    return 1 + treeSize(root->left) + treeSize(root->right);
}
void postorder(TreeNode*root,int *arr, int *pi)
{
    if(root == NULL)
    {
        return;
    }
    postorder(root->left,arr,pi);
    postorder(root->right,arr,pi);
    arr[(*pi)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize = treeSize(root);
    int* arr = (int*)malloc(sizeof(int)*(*returnSize));
    int i = 0;
    postorder(root,arr,&i);
    return arr;
}

运行结果:

8.二叉树的构建及遍历

代码:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct treenode{
    char data;
    struct treenode* left;
    struct treenode* right;
}treenode;

treenode* buynode(char ch)
{
    treenode* node = (treenode*)malloc(sizeof(treenode));
    if(node == NULL)
    {
        exit(1);
    }
    node->data = ch;
    node->left = node->right = NULL;
    return node;
}

treenode* createtree(char *arr,int *pi)
{
    if(arr[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    treenode *root = buynode(arr[*pi]);
    (*pi)++;
    root->left = createtree(arr, pi);
    root->right = createtree(arr, pi);

    return root;
}
void inorder(treenode* root)
{
    if(root == NULL)
    {
        return;
    }
    inorder(root->left);
    printf("%c ",root->data);
    inorder(root->right);
}
int main() {
   char arr[100];
   scanf("%s",arr);

   int i = 0;
   treenode*root = createtree(arr, &i);
   inorder(root);
   return 0;
}

运行结果:

提交结果:

二叉树选择题

二叉树性质:

对任何一棵二叉树, 如果度为 0 其叶结点个数为n0 , 度为 2 的分支结点个数为n2 ,则有 n0 = n2 + 1

证明上述性质:

假设一个二叉树有 a 个度为2的节点, b 个度为1的节点, c 个叶节点,则这个二叉树的边数是 2a+b

另一方面,由于共有 a+b+c 个节点,所以边数等于 a+b+c-1

结合上面两个公式:

2a+b = a+b+c-1 ,即: a = c-1

根据二叉树的性质,完成以下选择题:

  1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为

A 不存在这样的二叉树

B 200

C 198

D 199

我们先来分析题目

已知二叉树有399个节点,其中度为2的节点有199个,根据二叉树的特性为n0= n2 + 1

n2 = 199

n0 = 199+1 = 200

答案是B

2.在具有 2n 个结点的完全二叉树中,叶子结点个数为

A n

B n+1

C n-1

D n/2

题目分析:

在完全二叉树中2n = n0+n1+n2,我们知道n2 = n0 - 1因此可以写成,2n = n0+n1+n0 - 1简化后得到2n = 2n0 + n1- 1 在一颗完全二叉树中n1 不是0 就是1,将两个数都算一遍

n1 = 0;2n0 - 1 = 2n ---> n0 = n + 1/2

n1 = 1;2n0 = 2n ---> n0 = n

答案是A

3.一棵完全二叉树的结点数位为531个,那么这棵树的高度为

A 11

B 10

C 8

D 12

题目分析:

一个满二叉树为 2^h-1;h = log(n+1)

完全二叉树为 2^h - 1 >= n

因此完全二叉树为:2^h - 1 >= 531

2^10 - 1 = 1023

1023 > 531

答案是B

4.一个具有767个结点的完全二叉树,其叶子结点个数为

A 383

B 384

C 385

D 386

题目分析:

根据二叉树的性质可以得到 n0+n1+n2 = 767

n2 = n0 - 1

可以写成:n0+n1+n0-1 = 767,简化后得到2n0 + 1 - 1 = 767

完全二叉树中n1 不是0 就是1

n1 = 0; 2n0 + 0 - 1 = 767---> 2n0 - 1 = 767 --->2n0 = 768 ---->768/2 = 384

n1 = 1; 2n0+1-1 = 767 --->2n0 = 767 --->767/2 = 383.5

答案是B

链式二叉树遍历选择题

1.某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为

A ABDHECFG

B ABCDEFGH

C HDBEAFCG

D HDEBFGCA

题目分析:

前序序列的排序方式为根左右,所以为ABDHECFG

答案是A

2.二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树根结点为

A E

B F

C G

D H

题目分析:

先序遍历的遍历方式为根左右,E在先序遍历的第一位

答案是A

3.设一课二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树前序遍历序列为____

A adbce

B decab

C debac

D abcde

题目分析:

我们先将中序遍历和后序遍历先提取出来

开始排序,在后续遍历时最后一个为根节点,先将a提取出来

之后剩下bdce,后续遍历是bdec,b为左子树cde为右子树,所以先将b放到左子树

之后看中序遍历,中序遍历遍历顺序为左根右,因此可以得到

答案为D

4.某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右) 的序列

A FEDCBA

B CBAFED

C DEFCBA

D ABCDEF

答案分析:

这里说中序遍历和后续遍历都为ABCDEF,我们知道后续遍历的遍历顺序为左右根,根在最后一个

我们看到F在最后一个,而只有A选项F在第一个

答案为A

相关推荐
葡萄成熟时 !2 小时前
JDK时间类
java·开发语言
气派飞鹰2 小时前
windows下C++个人开发最佳实践(CMake+vcpkg+trae)
开发语言·c++·个人开发
余瑜鱼鱼鱼2 小时前
Thread类中run和start的区别
java·开发语言·前端
QZ_orz_freedom2 小时前
后端学习笔记-缓存数据
笔记·学习
n 55!w !1082 小时前
js练习作业
开发语言·javascript·ecmascript
单片机系统设计2 小时前
基于STM32的宠物智能喂食系统
c语言·stm32·单片机·嵌入式硬件·物联网·毕业设计·宠物
Whisper_Sy2 小时前
Flutter for OpenHarmony移动数据使用监管助手App实战 - 月报告实现
android·开发语言·javascript·网络·flutter·ecmascript
灰灰勇闯IT2 小时前
【Flutter for OpenHarmonyDart 入门日记】第5篇:字典类型 Map 与动态类型 dynamic 全解析
开发语言·javascript·ecmascript
leaves falling2 小时前
c语言- 有序序列合并
c语言·开发语言·数据结构