一、原理
二叉树算法核心思维:递归
满二叉树:二叉树的层数为K,节点数为
完全二叉树:二叉树的层数为K,前K-1层是满的,第K层是连续的
满二叉树是完全二叉树的子集。
任意二叉树:若叶子节点的个数是,设度为2(有2个子节点)的节点个数是,则
二叉树的第i层上最多有个节点,第n个节点的满二叉树深度。
二叉树可以顺序存储或链式存储。
二、BinaryTree.h
#define _CRT_SECURE_NO_WARNINGS 1#pragma
#include <iostream>
#include <string>
#include <cassert>
using namespace std;typedef char DataType;struct BinaryTreeNode
{DataType data;BinaryTreeNode* left;BinaryTreeNode* right;BinaryTreeNode(DataType x): data(x), left(nullptr), right(nullptr){}
};class BinaryTree
{typedef BinaryTreeNode Node;
public:// 构建,指定构造数据序列void Create(const DataType* datas, int& i){_root = _Create(datas, i);}// 先序遍历(根、左、右)void PreOrder(){_PreOrder(_root);cout << ",先序遍历结束" << endl;}// 中序遍历void InOrder(){_InOrder(_root);cout << ",中序遍历结束" << endl;}// 后序遍历void PastOrder(){_PastOrder(_root);cout << ",后序遍历结束" << endl;}// 总节点数int Size(){int num = 0;_Size(_root, num);return num;}// 叶子节点数int LeafSize(){int leafNum = 0;_LeafSize(_root, leafNum);return leafNum;}// 深度(层数)int Depth(){return _Depth(_root);}// 子树数量int TreeSize(){return _TreeSize(_root);}// 销毁void Destroy(){_Destroy(_root);_root = nullptr;cout << "二叉树销毁成功" << endl;}private:Node* _Create(const DataType* datas, int& i){if (datas[i] == '#')return nullptr;Node* root = new Node(datas[i]);root->left = _Create(datas, ++i);root->right = _Create(datas, ++i);return root;}void _PreOrder(Node* root){if (root == nullptr){cout << "# ";return;}cout << root->data << ' ';_PreOrder(root->left);_PreOrder(root->right);}void _InOrder(Node* root){if (root == nullptr){cout << "# ";return;}_InOrder(root->left);cout << root->data << ' ';_InOrder(root->right);}void _PastOrder(Node* root){if (root == nullptr){cout << "# ";return;}_PastOrder(root->left);_PastOrder(root->right);cout << root->data << ' ';}void _Size(Node* root, int& num){if (root == nullptr)return;++num;_Size(root->left, num);_Size(root->right, num);}void _LeafSize(Node* root, int& leafNum){if (root == nullptr)return;if (root->left == nullptr && root->right == nullptr)leafNum++;_LeafSize(root->left, leafNum);_LeafSize(root->right, leafNum);}int _Depth(Node* root){if (root == nullptr)return 0;int leftDepth = _Depth(root->left);int rightDepth = _Depth(root->right);return (leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1);}int _TreeSize(Node* root){if (root == nullptr)return 0;return (root->left == nullptr && root->right == nullptr) ? 0 :_TreeSize(root->left) + _TreeSize(root->right) + 1;}void _Destroy(Node* root){if (root == nullptr)return;_Destroy(root->left);_Destroy(root->right);cout << root->data << "销毁,";delete root;}private:Node* _root;
};
三、test.c
#define _CRT_SECURE_NO_WARNINGS 1#include "BinaryTree.h"int main()
{cout << "--Test1---" << endl << "数据序列: 123###45##6##" << endl;BinaryTree bt;// 构建二叉树int i = 0;bt.Create("123###45##6##", i);bt.PreOrder();bt.InOrder();bt.PastOrder();// 计算二叉树节点总数cout << "二叉树节点总数为:" << bt.Size() << endl; // 6// 计算二叉树叶子结点数cout << "二叉树叶子结点数为:" << bt.LeafSize() << endl; // 3// 计算二叉树深度cout << "二叉树深度:" << bt.Depth() << endl; // 3// 计算二叉树子树数量cout << "二叉树子树数量:" << bt.TreeSize() << endl; // 3// 销毁二叉树bt.Destroy(); // 3销毁,2销毁,5销毁,6销毁,4销毁,1销毁,二叉树销毁成功// 计算二叉树节点总数cout << "二叉树节点总数为:" << bt.Size() << endl;return 0;
}