二叉树基础操作
- 建立二叉树(这里用先序)
- 二叉树的先序遍历
- 二叉树的中序遍历
- 二叉树的后序遍历
- 测量二叉树深度
- 统计二叉树的节点个数
- 统计二叉树的叶子节点个数
所有操作均以递归形式(非递归的太麻烦了🐶 )
测试用例:
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
typedef struct Node //定义二叉树结构
{
char val;
struct Node* leftchild, * rightchild;
}*Bitree,BiNode;
void Create_Bitree(Bitree& T) //先序建立二叉树
{
char ch;
cin >> ch;
if (ch == '#') T = NULL; //设计终止符
else
{
T = new BiNode;
T->val = ch;
Create_Bitree(T->leftchild);
Create_Bitree(T->rightchild);
}
}
void PreOrderTraverse(Bitree T) //先序遍历(先节点数据,再左子树,再右子树)
{
if (T)
{
cout << T->val << ' ';
PreOrderTraverse(T->leftchild);
PreOrderTraverse(T->rightchild);
}
}
void InOrderTraverse(Bitree T) //中序遍历(先左子树,再节点数据,再右子树)
{
if (T)
{
InOrderTraverse(T->leftchild);
cout << T->val << ' ';
InOrderTraverse(T->rightchild);
}
}
void PostOrderTraverse(Bitree T) //后续遍历(先左子树,再右子树,再节点数据)
{
if (T)
{
PostOrderTraverse(T->leftchild);
PostOrderTraverse(T->rightchild);
cout << T->val << ' ';
}
}
int Deep_Bitree(Bitree T) //测量二叉树深度
{
if (T == NULL) return 0;
else
{
int left_depth = Deep_Bitree(T->leftchild);
int right_depth = Deep_Bitree(T->rightchild);
int depth = max(left_depth, right_depth) + 1;
return depth;
}
}
int Count_Node(Bitree T) //统计二叉树中所有节点个数
{
if (T == NULL) return 0;
else
{
int leftnum = Count_Node(T->leftchild);
int rightnum = Count_Node(T->rightchild);
return (leftnum + rightnum + 1);
}
}
int Count_Leaf(Bitree T) //统计二叉树中叶子节点个数
{
if (T == NULL)return 0;
else if (!T->leftchild && !T->rightchild) return 1;
else
{
int leftleaf = Count_Leaf(T->leftchild);
int rightleaf = Count_Leaf(T->rightchild);
return (leftleaf + rightleaf);
}
}
int main()
{
Bitree T;
cout << "先序遍历创建树,请输入(以‘#’结束): " << endl;
Create_Bitree(T); //创建二叉树
cout << "先序遍历结果:" << endl;
PreOrderTraverse(T); //先序遍历二叉树
cout << endl;
cout << "中序遍历结果:" << endl;
InOrderTraverse(T); //中序遍历二叉树
cout << endl;
cout << "后序遍历结果:" << endl;
PostOrderTraverse(T); //后序遍历二叉树
cout << endl;
cout << "二叉树的深度:" << Deep_Bitree(T) << endl; //测量二叉树的深度
cout << "二叉树节点个数:" << Count_Node(T) << endl; //计算二叉树节点的个数
cout << "二叉树叶子节点个数:" << Count_Leaf(T) << endl; //计算二叉树叶子节点的个数
}
测试结果如下: