文章目录
- 5.二叉树算法题
- 5.1 单值二叉树
- 5.2 相同的树
- 5.3 另一棵树的子树
- 5.4 二叉树遍历
- 5.5 二叉树的构建及遍历
- 6.二叉树选择题
5.二叉树算法题
5.1 单值二叉树
点击链接做题
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct TreeNode TreeNode;
bool isUnivalTree(struct TreeNode* root) {
if(root == NULL){
return true;
}
//root不为空,把root和root->left,root->right比较
if(root->left && root->left->val != root->val){
return false;
}
if(root->right && root->right->val != root->val){
return false;
}
//查看左子树和右子树是不是单值二叉树
return isUnivalTree(root->left) && isUnivalTree(root->right);
}
5.2 相同的树
点击链接做题
两棵树都为空树------相同的树
其一为空树------不是相同的树
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct TreeNode TreeNode;
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);
}
拓展学习
对称二叉树:
点击链接做题
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct TreeNode TreeNode;
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);
}
5.3 另一棵树的子树
点击链接做题
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct TreeNode TreeNode;
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);
}
//判断subRoot是不是root的子树
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
if(root == NULL){
return false;
}
if(isSameTree(root,subRoot)){
return true;
}
//判断root的左右子树是否和subRoot一样
return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}
5.4 二叉树遍历
前序遍历:
点击链接做题
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
typedef struct TreeNode TreeNode;
// ⼆叉树结点个数
int BinaryTreeSize(TreeNode* root)
{
if (root == NULL)
{
return 0;
}
return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}
//表示是当前函数的子函数
void _preorderTraversal(TreeNode* root,int* arr,int* pi){
if (root == NULL)
{
return;
}
//根左右
arr[(*pi)++] = root->val;
_preorderTraversal(root->left,arr,pi);
_preorderTraversal(root->right,arr,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
//int* returnSize是一个整型数组
//1.先求出二叉树结点的个数
*returnSize = BinaryTreeSize(root);
//2.动态申请内容---arr的大小
int* returnArr = (int*)malloc(sizeof(int)*(*returnSize));
//开始前序遍历
int i = 0;
_preorderTraversal(root,returnArr,&i);
return returnArr;
}
中序遍历:
点击链接做题
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
typedef struct TreeNode TreeNode;
// ⼆叉树结点个数
int BinaryTreeSize(TreeNode* root)
{
if (root == NULL)
{
return 0;
}
return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}
//表示是当前函数的子函数
void _preorderTraversal(TreeNode* root,int* arr,int* pi){
if (root == NULL)
{
return;
}
//左根右
_preorderTraversal(root->left,arr,pi);
arr[(*pi)++] = root->val;
_preorderTraversal(root->right,arr,pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize) {
//int* returnSize是一个整型数组
//1.先求出二叉树结点的个数
*returnSize = BinaryTreeSize(root);
//2.动态申请内容---arr的大小
int* returnArr = (int*)malloc(sizeof(int)*(*returnSize));
//开始中序遍历
int i = 0;
_preorderTraversal(root,returnArr,&i);
return returnArr;
}
后序遍历:
点击链接做题
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
typedef struct TreeNode TreeNode;
// ⼆叉树结点个数
int BinaryTreeSize(TreeNode* root)
{
if (root == NULL)
{
return 0;
}
return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}
//表示是当前函数的子函数
void _preorderTraversal(TreeNode* root,int* arr,int* pi){
if (root == NULL)
{
return;
}
//左右根
_preorderTraversal(root->left,arr,pi);
_preorderTraversal(root->right,arr,pi);
arr[(*pi)++] = root->val;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize) {
//int* returnSize是一个整型数组
//1.先求出二叉树结点的个数
*returnSize = BinaryTreeSize(root);
//2.动态申请内容---arr的大小
int* returnArr = (int*)malloc(sizeof(int)*(*returnSize));
//开始后序遍历
int i = 0;
_preorderTraversal(root,returnArr,&i);
return returnArr;
}
5.5 二叉树的构建及遍历
点击链接做题
代码:
#include <stdio.h>
typedef struct BinaryTreeNode {
char data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
} BTNode;
//创建节点
BTNode* buyNode(char x) {
BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
if (newnode == NULL) {
perror("malloc fail!");
exit(1);
}
newnode->data = x;
newnode->left = newnode->right = NULL;
return newnode;
}
//前序遍历
BTNode* creatrTree(char* arr, int* pi) {
if (arr[*pi] == '#') {//如果取到的是空字符,那么就不要创建它的根节点
(*pi)++;//继续往后走
return NULL;
}
//先创建arr[*pi]这个根节点,然后后置++,这样就到了后面的结点
BTNode* root = buyNode(arr[(*pi)++]);
root->left = creatrTree(arr, pi);//把根节点的左孩子当作新的根节点
root->right = creatrTree(arr, pi);
return root;
}
//中序遍历--左根右
void InOrder(BTNode* 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;
BTNode* root = creatrTree(arr, &i);//root指向二叉树的根节点
//输出二叉树的中序遍历
InOrder(root);
return 0;
}
6.二叉树选择题
二叉树性质
- 对任何一棵二叉树, 如果度为
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
根据二叉树的性质,完成以下选择题:(答案在后面)
- 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199
n0=n2+1
- 在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
A n
B n+1
C n-1
D n/2
n0+n1+n2=2N:所有节点加起来2n
因为n0=n2+1,所以化简为下面的
2n0+n1-1=2N
完全二叉树中有1
或0
个,度为1
的结点。
因为2N
是偶数,2n0是偶数,所以n1-1也为偶数,所以n1为奇数,n1=1。
2n0=2N,n0为n个
- 一棵完全二叉树的结点数位为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12
20+21+…+28+20=531
- 一个具有767个结点的完全二叉树,其叶子结点个数为()
A 383
B 384
C 385
D 386
2n0+n1-1=767
因为767是奇数,2n0是偶数,所以n1=0,n0=384
答案:
1.B
2.A
3.B
4.B
链式二叉树遍历选择题:(答案在后面)
- 某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为( )
A ABDHECFG
B ABCDEFGH
C HDBEAFCG
D HDEBFGCA
- 二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树根结点为()
A E
B F
C G
D H
- 设一课二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树前序遍历序列为()
A adbce
B decab
C debac
D abcde
- 某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为()
A FEDCBA
B CBAFED
C DEFCBA
D ABCDEF
1.A
2.A
3.D
4.A