二叉树的基本操作的c++实现

来源:互联网 发布:协同过滤算法基于物品 编辑:程序博客网 时间:2024/04/29 14:06
   二叉树的算法。
   先给出结点的类,顾名思义。是用来表示树的每个结点咯。里面包含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);elsereturn (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只为自己记录下来,也是小白,欢迎大家前来斧正:)



0 0
原创粉丝点击