当前位置:网站首页>判断二叉树是否为满二叉树
判断二叉树是否为满二叉树
2022-07-02 22:19:00 【明朗晨光】
1、题目
给定一棵二叉树的根节点,判断这棵二叉树是否为满二叉树。
2、分析
满二叉树:如果树的高度是 h h h,则节点数一定是 2 h − 1 2^h - 1 2h−1。
所以根据二叉树的递归套路:假设X为根节点的树,向左右子树收集两个信息:高度 h h h 和 节点数 n n n,判断是否满足满二叉树的条件。
另外,如果左树是满二叉树,右树是满二叉树,且左右树的高度一致,那么整棵树是满二叉树。
所以,也可以利用二叉树的递归套路,从左右树获取信息:(1)是否为满二叉树 (2)高度
3、实现
C++版
/************************************************************************* > File Name: 036.判断二叉树是否为满二叉树.cpp > Author: Maureen > Mail: [email protected] > Created Time: 五 7/ 1 16:37:02 2022 ************************************************************************/
#include <iostream>
#include <ctime>
using namespace std;
class TreeNode {
public:
int value;
TreeNode *left;
TreeNode *right;
TreeNode(int data) : value(data) {
}
};
//方法1:收集整棵树的高度和节点数
//只有满二叉树满足:2^h - 1 == n
class Info1 {
public:
int height;//高度
int nodeCnt;//节点数
Info1(int h, int c) : height(h), nodeCnt(c) {
}
};
Info1 *process1(TreeNode *x) {
if (x == nullptr) {
return new Info1(0, 0);
}
Info1 *leftInfo = process1(x->left);
Info1 *rightInfo = process1(x->right);
int height = max(leftInfo->height, rightInfo->height) + 1;
int nodeCnt = leftInfo->nodeCnt + rightInfo->nodeCnt + 1;
return new Info1(height, nodeCnt);
}
bool isFullBT1(TreeNode *root) {
if (root == nullptr) return true;
Info1 *info = process1(root);
return (1 << info->height) - 1 == info->nodeCnt;
}
//方法2: 收集 子树是否满二叉树 和 子树高度
//左树满 && 右树满 && 左树高度和右树高度一样,那么整棵树就是满的
class Info2 {
public:
bool isFull;
int height;
Info2(bool isfull, int h) : isFull(isfull), height(h) {
}
};
Info2 *process2(TreeNode *x) {
if (x == nullptr) {
return new Info2(true, 0);
}
Info2 *leftInfo = process2(x->left);
Info2 *rightInfo = process2(x->right);
int height = max(leftInfo->height, rightInfo->height) + 1;
bool isFull = leftInfo->isFull && rightInfo->isFull && leftInfo->height == rightInfo->height;
return new Info2(isFull, height);
}
bool isFullBT2(TreeNode *root) {
return process2(root)->isFull;
}
//for test
TreeNode *generate(int level, int maxl, int maxv) {
if (level > maxl || (rand() % 100 / (double)101) < 0.5)
return nullptr;
TreeNode *root = new TreeNode(rand() % maxv);
root->left = generate(level + 1, maxl, maxv);
root->right = generate(level + 1, maxl, maxv);
return root;
}
TreeNode *generateRandomBST(int level, int value) {
return generate(1, level, value);
}
int main() {
srand(time(0));
int level = 5;
int value = 100;
int testTimes = 1000001;
cout << "Test begin:" << endl;
for (int i = 0; i < testTimes; i++) {
TreeNode *root = generateRandomBST(level, value);
if (isFullBT1(root) != isFullBT2(root)) {
cout << "Failed!" << endl;
return 0;
}
}
cout << "Success!" << endl;
return 0;
}
Java 版
public class isFullBT {
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
// 第一种方法
// 收集整棵树的高度h,和节点数n
// 只有满二叉树满足 : 2 ^ h - 1 == n
public static boolean isFull1(Node head) {
if (head == null) {
return true;
}
Info1 all = process1(head);
return (1 << all.height) - 1 == all.nodes;
}
public static class Info1 {
public int height; //高度
public int nodes; //节点数
public Info1(int h, int n) {
height = h;
nodes = n;
}
}
public static Info1 process1(Node head) {
if (head == null) {
return new Info1(0, 0);
}
Info1 leftInfo = process1(head.left);
Info1 rightInfo = process1(head.right);
int height = Math.max(leftInfo.height, rightInfo.height) + 1;
int nodes = leftInfo.nodes + rightInfo.nodes + 1;
return new Info1(height, nodes);
}
// 第二种方法
// 收集子树是否是满二叉树
// 收集子树的高度
// 左树满 && 右树满 && 左右树高度一样 -> 整棵树是满的
public static boolean isFull2(Node head) {
if (head == null) {
return true;
}
return process2(head).isFull;
}
public static class Info2 {
public boolean isFull;
public int height;
public Info2(boolean f, int h) {
isFull = f;
height = h;
}
}
public static Info2 process2(Node h) {
if (h == null) {
return new Info2(true, 0);
}
Info2 leftInfo = process2(h.left);
Info2 rightInfo = process2(h.right);
boolean isFull = leftInfo.isFull && rightInfo.isFull && leftInfo.height == rightInfo.height;
int height = Math.max(leftInfo.height, rightInfo.height) + 1;
return new Info2(isFull, height);
}
// for test
public static Node generateRandomBST(int maxLevel, int maxValue) {
return generate(1, maxLevel, maxValue);
}
// for test
public static Node generate(int level, int maxLevel, int maxValue) {
if (level > maxLevel || Math.random() < 0.5) {
return null;
}
Node head = new Node((int) (Math.random() * maxValue));
head.left = generate(level + 1, maxLevel, maxValue);
head.right = generate(level + 1, maxLevel, maxValue);
return head;
}
public static void main(String[] args) {
int maxLevel = 5;
int maxValue = 100;
int testTimes = 1000000;
System.out.println("测试开始");
for (int i = 0; i < testTimes; i++) {
Node head = generateRandomBST(maxLevel, maxValue);
if (isFull1(head) != isFull2(head)) {
System.out.println("出错了!");
}
}
System.out.println("测试结束");
}
}
边栏推荐
- MarkDown基本语法
- YOLOX加强特征提取网络Panet分析
- 数据集-故障诊断:西储大学轴承的各项数据以及数据说明
- C MVC creates a view to get rid of the influence of layout
- Deep analysis of data storage in memory - C language
- “一个优秀程序员可抵五个普通程序员!”
- Cryptographic technology -- key and ssl/tls
- Dishes launcher small green program and directory management (efficiency tool)
- Where is the win11 microphone test? Win11 method of testing microphone
- What experience is there only one test in the company? Listen to what they say
猜你喜欢

Realize the linkage between bottomnavigationview and navigation

Catalogue of digital image processing experiments

C# MVC创建一个视图摆脱布局的影响

Solution: exceptiole 'xxxxx QRTZ_ Locks' doesn't exist and MySQL's my CNF file append lower_ case_ table_ Error message after names startup

Hisilicon VI access video process

Redis expiration policy +conf record

Interface switching based on pyqt5 toolbar button -2
![[live broadcast appointment] database obcp certification comprehensive upgrade open class](/img/d8/a367c26b51d9dbaf53bf4fe2a13917.png)
[live broadcast appointment] database obcp certification comprehensive upgrade open class

Load balancing cluster (LBC)

Where is the win11 automatic shutdown setting? Two methods of setting automatic shutdown in win11
随机推荐
Implementation of VGA protocol based on FPGA
第三方支付功能测试点【杭州多测师_王sir】【杭州多测师】
RuntimeError: no valid convolution algorithms available in CuDNN
Bean加载控制
Simple square wave generating circuit [51 single chip microcomputer and 8253a]
BBR encounters cubic
[adjustment] postgraduate enrollment of Northeast Petroleum University in 2022 (including adjustment)
Load balancing cluster (LBC)
ADC of stm32
JSON data transfer parameters
I've been interviewed. The starting salary is 16K
Numerical solution of partial differential equations with MATLAB
Win11如何开启目视控制?Win11开启目视控制的方法
How can cross-border e-commerce achieve low-cost and steady growth by laying a good data base
JDBC练习案例
Win11启用粘滞键关闭不了怎么办?粘滞键取消了但不管用怎么解决
Is 408 not fragrant? The number of universities taking the 408 examination this year has basically not increased!
Doorplate making C language
数字图像处理实验目录
Li Kou brush questions (2022-6-28)