二叉树 ---- 所有结点数

普通二叉树的结点数:

递归法:

对二叉树进行前序or后序遍历:

cpp 复制代码
typedef struct Tree
{
	int data;
	Tree* leftChild;
	Tree* rightChild;
}tree,*linklist;
//计算普通二叉树的结点数
int nodenums(linklist node)
{
	if(node == nullptr)  return 0;  //node为空就返回0
    int leftnums = nodenums(node->leftChild); //左子树的数量通过递归计算出来
    int rightnums = nodenums(node->rightChild); //右子树的数量通过递归计算出来
	return leftnums + rightnums + 1;返回左子树的数量 + 右子树的数量 + 1(根结点的数量)
}

化简写法:

cpp 复制代码
typedef struct Tree
{
	int data;
	Tree* leftChild;
	Tree* rightChild;
}tree,*linklist;
//计算普通二叉树的结点数
int nodenums(linklist node)
{
	if(node == nullptr)  return 0;
	return 1 + nodenums(node->leftChild) + nodenums(node->rightChild);
}

队列法:

利用BFS的思想层序遍历:

cpp 复制代码
#include <queue>
typedef struct Tree
{
	int data;
	Tree* leftChild;
	Tree* rightChild;
}tree,*linklist;
//法二(BFS)
int coutnode(linklist node)
{
	queue<linklist> q; //建立新的linklist型队列q
    if(node == nullptr) q.push(node); //如果node不为空,就把结点node推进队列
	int result = 0;//result用来存结点数
    //BFS层序遍历
	while(q.empty())
	{
		int size = q.size();
		for(int i = 0;i < size;i++)
		{
			linklist p = q.front();
			q.pop();
			result++;  //记录结点数
			if(p->leftChild) q.push(node->leftChild);
			if(p->rightChild) q.push(node->rightChild);
		}
	}
	return result;	
}

完全二叉树的结点数:

完全二叉树的本身会包含满二叉树,可以简便写,++先判断最大的满二叉树的位置然后再利用普通二叉树的递归遍历方法进行计算++。

如果遇到满二叉树,则返回满二叉树的结点数,可以利用公式2^n-1,利用位运算(2 << n) - 1。

(n为深度),也可以利用我前面的文章讲述的快速幂利用递归求出二次幂。

cpp 复制代码
int nodenum(linklist node)
{
	if(node == nullptr)  return 0;
	linklist left = node->leftChild;
	linklist right = node->rightChild;
    //左右子树深度
	int leftdepth = 0;
	int rightdepth = 0;
	while(left)
	{
		left = left->leftChild;
		leftdepth++;
	}
	while(right)
	{
		right = right->rightChild;
		rightdepth++;
	}
    //如果左右子树的深度相等就是满二叉树
	if(leftdepth == rightdepth) return (2 << leftdepth) - 1;//满二叉树的计算结点公式2^n-1
	return 1 + nodenum(node->leftChild) + nodenum(node->rightChild);
}

判断平衡二叉树:

二叉树中任意结点的左右子树的深度相差不超过 1,那么它就是一棵平衡二叉树 。

所以abs(左子树深度 - 右子树深度) > 1就不是平衡二叉树。

所以++先按照最大深度的计算方法递归左右子树的最大深度然后判断是否符合平衡二叉树,如果不是就return返回false,最后return返回平衡二叉树的最大深度++。

cpp 复制代码
typedef struct Tree
{
	int data;
	Tree* leftChild;
	Tree* rightChild;
}tree,*linklist;
//如果不是平衡二叉树,那么就返回-1记录其不是平衡二叉树
int balancedepth(linklist node)
{
	int leftdepth = balancedepth(node->leftChild);
	if(leftdepth == -1)  return -1;
	int rightdepth = balancedepth(node->rightChild);
	if(rightdepth == -1)  return -1;
	if(abs(leftdepth - rightdepth) > 1)  return -1;//不平衡
	return 1 + max(leftdepth , rightdepth);
}

输入一棵二叉树的根结点,判断该树是不是平衡二叉树。

如果某二叉树中任意结点的左右子树的深度相差不超过 1,那么它就是一棵平衡二叉树。

注意:

  • 规定空树也是一棵平衡二叉树。
数据范围

树中节点数量 [0,500]。

样例
复制代码
输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示,
    5
   / \
  7  11
    /  \
   12   9

输出:true
cpp 复制代码
struct TreeNode 
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
    bool isBalanced(TreeNode* root) {
        int res = dfs(root);
        if(res != -1)  return true;
        else  return false;
    }
    int dfs(TreeNode* root)
    {
        if(!root)  return 0;
        int leftdepth = dfs(root->left),rightdepth = dfs(root->right);
        if(leftdepth == -1 || rightdepth == -1)  return -1;
        if(abs(rightdepth - leftdepth) > 1)  return -1;
        return 1 + max(leftdepth , rightdepth);
    }
};

今天内容到这里了,感谢收看。

相关推荐
Kisorge36 分钟前
【电机控制】基于STM32F103C8T6的二轮平衡车设计——LQR线性二次线控制器(算法篇)
stm32·嵌入式硬件·算法
hnjzsyjyj2 小时前
洛谷 P12141:[蓝桥杯 2025 省 A] 红黑树
数据结构·蓝桥杯·二叉树
铭哥的编程日记2 小时前
深入浅出蓝桥杯:算法基础概念与实战应用(二)基础算法(下)
算法·职场和发展·蓝桥杯
Swift社区2 小时前
LeetCode 421 - 数组中两个数的最大异或值
算法·leetcode·职场和发展
cici158742 小时前
基于高光谱成像和偏最小二乘法(PLS)的苹果糖度检测MATLAB实现
算法·matlab·最小二乘法
fei_sun2 小时前
【总结】数据结构---排序
数据结构
StarPrayers.3 小时前
自蒸馏学习方法
人工智能·算法·学习方法
大锦终3 小时前
【动规】背包问题
c++·算法·动态规划
智者知已应修善业4 小时前
【c语言蓝桥杯计算卡片题】2023-2-12
c语言·c++·经验分享·笔记·算法·蓝桥杯
hansang_IR4 小时前
【题解】洛谷 P2330 [SCOI2005] 繁忙的都市 [生成树]
c++·算法·最小生成树