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

普通二叉树的结点数:

递归法:

对二叉树进行前序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);
    }
};

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

相关推荐
阿史大杯茶38 分钟前
Codeforces Round 976 (Div. 2 ABCDE题)视频讲解
数据结构·c++·算法
LluckyYH1 小时前
代码随想录Day 58|拓扑排序、dijkstra算法精讲,题目:软件构建、参加科学大会
算法·深度优先·动态规划·软件构建·图论·dfs
转调1 小时前
每日一练:地下城游戏
开发语言·c++·算法·leetcode
不穿格子衬衫2 小时前
常用排序算法(下)
c语言·开发语言·数据结构·算法·排序算法·八大排序
wdxylb2 小时前
使用C++的OpenSSL 库实现 AES 加密和解密文件
开发语言·c++·算法
aqua35357423582 小时前
蓝桥杯-财务管理
java·c语言·数据结构·算法
CV金科2 小时前
蓝桥杯—STM32G431RBT6(IIC通信--EEPROM(AT24C02)存储器进行通信)
stm32·单片机·嵌入式硬件·算法·蓝桥杯
sewinger2 小时前
区间合并算法详解
算法
XY.散人2 小时前
初识算法 · 滑动窗口(1)
算法
韬. .3 小时前
树和二叉树知识点大全及相关题目练习【数据结构】
数据结构·学习·算法