二叉树
Posted guoshuai-ouc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树相关的知识,希望对你有一定的参考价值。
二叉树的基本操作(C++)
1. 首先创建二叉树结构,以及二叉树的类,定义在BinaryTree.h中
1 #ifndef _BINARYTREE_H 2 #define _BINARYTREE_H 3 #include "pch.h" 4 #include <iostream> 5 6 using namespace std; 7 8 typedef struct TreeNode 9 { 10 char val; //节点的数据类型 11 TreeNode * left; //左子树 12 TreeNode * right; //右子树 13 TreeNode(char x):val(x), left(nullptr), right(nullptr) {} 14 15 }TreeNode, *BiTree; 16 17 class BinaryTree 18 { 19 public: 20 BinaryTree() {} 21 ~BinaryTree() {} 22 void TreeCreate(); //递归的创建二叉树的节点 23 int getSize(); //递归得到树的节点数目 24 int getHeight(); //递归得到树的高度 25 void preOrder(); //前序遍历 26 void inOrder(); //中序遍历 27 void postOrder(); //后序遍历 28 void distroy(); //删除二叉树 29 30 private: 31 BiTree create(); //递归的创建二叉树的节点 32 void preOrder(BiTree root); //前序遍历 33 void inOrder(BiTree root); //中序遍历 34 void postOrder(BiTree root); //后序遍历 35 void distroy(BiTree root); //摧毁树 36 int getHeight(BiTree root); //递归得到树的高度 37 void AddNode(const char key, int direction, BiTree root); //添加节点 38 BiTree m_root; //根节点 39 int size; //节点总数 40 }; 41 42 #endif
2. 具体实现 BinaryTree.cpp
# include "BinaryTree.h"
#pragma region 私有成员函数
//添加节点
//key为要插入的值,direction是从左子树插入还是右子树插入,root为从哪个节点插入
void BinaryTree::AddNode(const char key, int direction, BiTree root)
{
if (direction == 0)
{
//从左子树插入
if (root->left == NULL)
root->left = new TreeNode(key);
else
AddNode(key, direction, root->left);
}
else if (direction == 1)
{
//从右子树插入
if (root->right == NULL)
root->right = new TreeNode(key);
else
AddNode(key, direction, root->right);
}
}
//二叉树的建立,按前序遍历(root->left->right)的方式建立二叉树
BiTree BinaryTree::create()
{
BiTree current = NULL;
char val;
cin >> val;//输入键值
if (val == ‘#‘)//标识当前子树为空,转向下一节点
{
return NULL;
}
else
{ //递归的创建左右子树
size++;//记录节点数
current = new TreeNode(val);
current->left = create();
current->right = create();
return current;
}
}
//删除二叉树
void BinaryTree::distroy(BiTree root)
{
if (root)
{
distroy(root->left);
distroy(root->right);
delete root;
root = NULL;
size = 0;
}
}
//递归得到树的高度
int BinaryTree::getHeight(BiTree root)
{
if (root == NULL)
return 0;
int left_height = getHeight(root->left);
int right_height = getHeight(root->right);
return (left_height > right_height) ? (left_height + 1) : (right_height + 1);
}
//前序遍历 root->left->right
void BinaryTree::preOrder(BiTree root)
{
if (root == NULL)
return;
else
{
cout << root->val << " --> "; //首先打印根节点
preOrder(root->left); //接着遍历左子树
preOrder(root->right); //接着遍历右子树
}
}
//中序遍历 left->root->right
void BinaryTree::inOrder(BiTree root)
{
if (root == NULL)
return;
else
{
inOrder(root->left); //首先遍历左子树
cout << root->val << " --> "; //接着打印根节点
inOrder(root->right); //接着遍历右子树
}
}
//后序遍历 left->right->root
void BinaryTree::postOrder(BiTree root)
{
if (root == NULL)
return;
else
{
postOrder(root->left); //首先遍历左子树
postOrder(root->right); //接着遍历右子树
cout << root->val << " --> "; //接着打印根节点
}
}
#pragma endregion
#pragma region 公有成员函数
//二叉树的建立
void BinaryTree::TreeCreate()
{
size = 0;
m_root =create();
}
//删除二叉树
void BinaryTree::distroy()
{
distroy(m_root);
}
//递归得到树的高度
int BinaryTree::getHeight()
{
return getHeight(m_root);
}
//前序遍历
void BinaryTree::preOrder()
{
cout << "前序遍历的结果如下:" << endl;
preOrder(m_root);
cout << endl;
}
//中序遍历
void BinaryTree::inOrder()
{
cout << "中序遍历的结果如下:" << endl;
inOrder(m_root);
cout << endl;
}
//后序遍历
void BinaryTree::postOrder()
{
cout << "后序遍历的结果如下:" << endl;
postOrder(m_root);
cout << endl;
}
//获取大小
int BinaryTree::getSize()
{
//这里是创建时候直接进行了计数
//也可以利用遍历的方式获取,当节点有值,就加1
return size;
}
#pragma endregion
3.主函数调用
int main() { BinaryTree tree; cout << "按前序遍历方式创建树" << endl; //"ABDG##H###CE#I##F##"; tree.TreeCreate(); cout << "树的高度为:" << tree.getHeight() << endl; cout << "树的节点为:" << tree.getSize() << endl; tree.preOrder(); //前序遍历 tree.inOrder(); //中序遍历 tree.postOrder(); //后序遍历 tree.distroy(); //摧毁树 system("pause"); }
以上是关于二叉树的主要内容,如果未能解决你的问题,请参考以下文章