二叉树的算法。
先给出结点的类,顾名思义。是用来表示树的每个结点咯。里面包含char型的data(因为我想是让树的结点值是字母,如果你希望是数字那就int啥的,这个随意吧~)
代码如下:
//Focus.L carpe diem :)
//BiTree node.h
#ifndef NODE_H_
#define NODE_H_
#define NULL 0
//结点的类
class node{
public:
char data; //结点值
node *lchild, *rchild; //左孩子,右孩子结点
node *parent; //父结点
//构造函数
node()
{
data = 0;
lchild = NULL;
rchild = NULL;
parent = NULL;
}
}BiTree;
#endif
然后就是具体的操作咯。分为二叉树的初始化,建立二叉树,先序遍历,中序遍历,后序遍历,层次遍历,求二叉树的深度,求二叉树的结点数,二叉树的复制。代码如下:
//Focus.L carpe diem :)
//BiTree
#include <iostream>
#include <cstdio>
#include <cstring>
#include "node.h"
using namespace std;
//函数声明
//二叉树初始化
node *InitBiTree();
//销毁二叉树
void DestroyBiTree(node *&T);
//建立二叉树
void CreateBiTree(node *&T);
//先序遍历二叉树
void PreOrderTraverse(node *T);
//中序遍历二叉树
void InOrderTraverse(node *T);
//后序遍历二叉树
void PostOrderTraverse(node *T);
//层次遍历二叉树
void LevelOrderTraverse(node *T);
int printLevelOrderTraverse(node *T, int level);
//二叉树的深度
int BiTreeDepth(node *T);
//二叉树的结点数
int BiTreeNodes(node *T);
//二叉树的复制
void BiTreeDuplicate(node *T, node *&T1);
//二叉树初始化
node *InitBiTree()
{
node *T = new node();
return T;
}
//node & initBiTree(){
// node * T = new node();
// return *T;
//}
//销毁二叉树
void DestroyBiTree(node *&T)
{
if (T->lchild != NULL)
DestroyBiTree(T->lchild);
if (T->rchild != NULL)
DestroyBiTree(T->rchild);
delete(T);
}
//建立二叉树
void CreateBiTree(node *&T)
{
char ch;
//cout << "please enter the keys:" << endl;
cin >> ch;
if (ch == '#')
T = NULL;
else
{
T = new node();
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序遍历二叉树
void PreOrderTraverse(node *T)
{
if (T != NULL)
{
cout << T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历二叉树
void InOrderTraverse(node *T)
{
if (T != NULL)
{
InOrderTraverse(T->lchild);
cout << T->data;
InOrderTraverse(T->rchild);
}
}
//后序遍历二叉树
void PostOrderTraverse(node *T)
{
if (T != NULL)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data;
}
}
//层次遍历二叉树算法
int printLevelOrderTraverse(node *T, int level)
{
if (!T || level < 0)
return 0;
if (level == 0)
{
cout << T->data << " ";
return 1;
}
return printLevelOrderTraverse(T->lchild, level - 1) + printLevelOrderTraverse(T->rchild, level - 1);
}
void LevelOrderTraverse(node *T)
{
int i = 0;
for (i = 0;; i++)
{
if (!printLevelOrderTraverse(T, i))
break;
}
cout << endl;
}
//二叉树的深度
int BiTreeDepth(node *T)
{
if (T)
{
int depl, depr;
depl = BiTreeDepth(T->lchild);
depr = BiTreeDepth(T->rchild);
if (depl >= depr)
return (depl + 1);
else
return (depr + 1);
}
return 0;
}
//二叉树的结点数
int BiTreeNodes(node *T)
{
if (T)
{
int num;
num = BiTreeNodes(T->lchild);
num = num + BiTreeNodes(T->rchild);
num++;
return num;
}
return 0;
}
//二叉树的复制
void BiTreeDuplicate(node *T, node *&T1)
{
if (T)
{
T1 = new node();
T1->data = T->data;
T1->lchild = T1->rchild = NULL;
BiTreeDuplicate(T->lchild, T1->lchild);
BiTreeDuplicate(T->rchild, T1->rchild);
}
}
//菜单
void menu()
{
cout << "*******************Menu********************" << endl;
cout << "enter the No of the operation you wanna do:" << endl;
cout << "1.PreOrderTraverse" << " " << "2.InOrderTraverse" << endl;
cout << "3.PostOrderTraverse" << " " << "4.LevelOrderTraverse" << endl;
cout << "5.Get the depth of the tree" << " " << "6.Get the numbers of the nodes" << endl;
cout << "7.Duplicate the tree and print as PreOrderTraverse" << endl;
}
int main()
{
int n;
node *BiTree, *BiTree1;
BiTree = new node();
cout << "以先序顺序输入二叉树,#表示空结点,应将二叉树的所有结点都输入进去" << endl;
cout << "Example 想输入a为父结点,b和c分别为左右孩子结点的时候则输入: ab##c## " << endl;
cout << "please enter the keys:" << endl;
InitBiTree();
CreateBiTree(BiTree);
menu();
cin >> n;
switch (n)
{
case(1):
cout << "PreOrderTraverse result:" << endl;
PreOrderTraverse(BiTree);
cout << endl;
break;
case(2) :
cout << "InOrderTraverse result:" << endl;
InOrderTraverse(BiTree);
cout << endl;
break;
case(3) :
cout << "PostOrderTraverse result:" << endl;
PostOrderTraverse(BiTree);
cout << endl;
break;
case(4) :
cout << "LevelOrderTraverse result:" << endl;
LevelOrderTraverse(BiTree);
cout << endl;
cout << "(PreOrderTraverse the new BiTree)" << endl;
break;
case(5) :
cout << "Depth of the BiTree is:" << endl;
cout << BiTreeDepth(BiTree) << endl;
break;
case(6) :
cout << "Numbers of the BiTree Nodes is:" << endl;
break;
cout << BiTreeNodes(BiTree) << endl;
case(7):
cout << "The Duplicated Tree is:" << endl;
BiTreeDuplicate(BiTree, BiTree1);
PreOrderTraverse(BiTree1);
cout << endl;
break;
}
return 0;
}
由于二叉树的各种操作较为简单,里面也稍加注释,所以就不再累述。写blog只为自己记录下来,也是小白,欢迎大家前来斧正:)