当前位置:网站首页>判断二叉树是否为满二叉树
判断二叉树是否为满二叉树
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("测试结束");
}
}
边栏推荐
- Hisilicon VI access video process
- 2022 latest and complete interview questions for software testing
- Ping domain name error unknown host, NSLOOKUP / system d-resolve can be resolved normally, how to Ping the public network address?
- Pandora IOT development board learning (HAL Library) - Experiment 3 key input experiment (learning notes)
- Interface switching based on pyqt5 toolbar button -1
- Golang common settings - modify background
- 购买完域名之后能干什么事儿?
- Numerical solution of partial differential equations with MATLAB
- Bean load control
- MySQL基础
猜你喜欢

数字图像处理实验目录

LINQ usage collection in C #

Where is the win11 automatic shutdown setting? Two methods of setting automatic shutdown in win11

Convolution和Batch normalization的融合

Convolution和Batch normalization的融合

Compose 中的 'ViewPager' 详解 | 开发者说·DTalk

基于Pyqt5工具栏按钮可实现界面切换-2

(stinger) use pystinger Socks4 to go online and not go out of the network host

I've been interviewed. The starting salary is 16K

聊聊内存模型与内存序
随机推荐
为什么RTOS系统要使用MPU?
Redis expiration policy +conf record
Go basic anonymous variable
What experience is there only one test in the company? Listen to what they say
Fudian bank completes the digital upgrade | oceanbase database helps to layout the distributed architecture of the middle office
JSON数据传递参数
Markdown basic grammar
[Verilog tutorial]
Troubleshooting the cause of the crash when STM32 serial port dam receives 253 bytes
Bean load control
SharedPreferences save list < bean > to local and solve com google. gson. internal. Linkedtreemap cannot be cast to exception
Solving ordinary differential equations with MATLAB
万物并作,吾以观复|OceanBase 政企行业实践
Talk about memory model and memory order
Yolox enhanced feature extraction network panet analysis
The use of 8255 interface chip and ADC0809
Brief introduction to common sense of Zhongtai
潘多拉 IOT 开发板学习(HAL 库)—— 实验3 按键输入实验(学习笔记)
2022年最新最全软件测试面试题大全
一文掌握基于深度学习的人脸表情识别开发(基于PaddlePaddle)