数据结构——树——C++实现树及其操作

来源:互联网 发布:java redis 清除缓存 编辑:程序博客网 时间:2024/06/02 06:17

C++实现二叉树的构建和操作

1:二叉树的定义:使用链式存储的方式定义

2:二叉树的初始化

3:查找结点

4:加入结点

5:遍历二叉树

6:显示结点

7:计算二叉树的深度


切记亲力亲为,动手实践写代码

tree.h

#ifndef DS_TREE_TREE_H#define DS_TREE_TREE_H#include <iostream>using std::cout;using std::cin;using std::endl;/*递归的思想在二叉树的实现过程中非常的重要*///数据结构—树的定义(大小及保存数据类型)#define MAXLEN 20typedef char DATA;//结点的数据集合struct  CBTTYPE {DATA data;CBTTYPE *left;CBTTYPE *right;};/*********************初始化二叉树***********************///将一个结点设置为二叉树的根结点CBTTYPE* Init_tree(){CBTTYPE *root_node;if (root_node = new CBTTYPE){cout<<"Please input the root node data: ";cin>>root_node->data;root_node->left = NULL;//将根结点的左右结点指针置为空root_node->right = NULL;if (root_node != NULL){return root_node;}else{return NULL;}}return NULL;}/*********************二叉树查找结点***********************///在二叉树中查找结点,函数返回该结点的指针//输入参数tree_node为待查找的二叉树的根结点,输入参数data为待查找的结点数据CBTTYPE* Find_node(CBTTYPE* tree_node,DATA data){CBTTYPE *temp_ptr;if (tree_node == NULL){return NULL;}else{if (tree_node->data == data){return tree_node;}else{if (temp_ptr = Find_node(tree_node->left,data)){return temp_ptr;}else if (temp_ptr = Find_node(tree_node->right,data)){return temp_ptr;}else{return NULL;}}}}/*********************二叉树添加结点***********************///向二叉树添加结点//输入参数treeNode为二叉树的根结点,传入根节点是为了方便查找父结点void Add_node(CBTTYPE *root_node){CBTTYPE *pnode,*parent;DATA parent_data;char temp;if (pnode = new CBTTYPE){cout<<"Please input the node data: ";cin>>pnode->data;pnode->left = NULL;pnode->right = NULL;cout<<"Please input this node's parent_node data:";cin>>parent_data;parent = Find_node(root_node,parent_data);if (!parent){cout<<"Never find~"<<endl;delete pnode;return;}cout<<"This add_node is left_node or right_node ?"<<endl;cout<<"Use 1 represent left_node and 2 represent right_node :"<<endl;do {cin>>temp;if (temp == '1' || temp == '2'){switch (temp){case '1':if (parent->left){cout<<"The parent_node's left_node is not empty"<<endl;return;}else{parent->left = pnode;cout<<"This node is successfully added !"<<endl;}break;case '2':if (parent->right){cout<<"The parent_node's right_node is not empty"<<endl;return;}else{parent->right = pnode;cout<<"This node is successfully added !"<<endl;}break;default:cout<<"1 or 2 ?"<<endl;break;}}} while (temp != '1' && temp != '2');}}/*********************计算二叉树的深度***********************///输入参数root_node为待计算的二叉树的根结点int Tree_depth(CBTTYPE *root_node){int left_depth,right_depth;if (root_node == NULL){return 0;}else{left_depth = Tree_depth(root_node->left);right_depth = Tree_depth(root_node->right);if (left_depth){return ++left_depth;}else{return ++right_depth;}}}/*********************清空二叉树***********************///输入参数root_node为待计算的二叉树的根结点void Clear_tree(CBTTYPE *root_node){if (root_node){Clear_tree(root_node->left);Clear_tree(root_node->right);delete root_node;//释放当前结点}}/*********************显示结点数据***********************///传入一个结点指针void Show_node_data(CBTTYPE *node){cout<<node->data<<" ";}/*********************先序遍历二叉树***********************/void Show_tree_first(CBTTYPE *root_node){if (root_node){Show_node_data(root_node);Show_tree_first(root_node->left);Show_tree_first(root_node->right);}}/*********************中序遍历二叉树***********************/void Show_tree_middle(CBTTYPE *root_node){if (root_node){Show_tree_middle(root_node->left);Show_node_data(root_node);Show_tree_middle(root_node->right);}}/*********************后序遍历二叉树***********************/void Show_tree_back(CBTTYPE *root_node){if (root_node){Show_tree_back(root_node->left);Show_tree_back(root_node->right);Show_node_data(root_node);}}#endif DS_TREE_TREE_H


main.cpp

/***************************************************************************  *  @file       main.cpp  *  @author     MISAYAONE  *  @date       3  April 2017  *  @remark     3  April 2017   *  @theme      DS_tree   ***************************************************************************/  #include <iostream>#include "tree.h"using std::cout;using std::cin;using std::endl;int main(int argc, char** argv){char temp_char1;do {cout<<"Please select mode of operation: "<<endl;cout<<"a:Initiate a tree"<<endl;cout<<"b:Nothing to do"<<endl;cin>>temp_char1;if (temp_char1 == 'a'){CBTTYPE *root_node = NULL;root_node = Init_tree();char temp_char2;cout<<"Please select mode of operation: "<<endl;cout<<"a:Initiate a tree with full nodes"<<endl;cout<<"b:Show me the nodes"<<endl;cout<<"c:Nothing to do"<<endl;cin>>temp_char2;if (temp_char2 == 'a'){int tree_size;cout<<"Tell me the size of the tree:";cin>>tree_size;for (int i = 0; i < tree_size; ++i){Add_node(root_node);}cout<<"The tree is now successfully initiated !"<<endl;char temp_char3 = 't';while (temp_char3 != 'f'){cout<<"Please select mode of operation: "<<endl;cout<<"a: pre_order traverse "<<endl;cout<<"b: in_order traverse  "<<endl;cout<<"c: post_order traverse"<<endl;cout<<"d: Want to know the tree depth ?"<<endl;cout<<"e: Find a node in this tree ?"<<endl;cout<<"f: Nothing to do "<<endl;cin>>temp_char3;if (temp_char3 != 'f'){switch (temp_char3){case 'a' :Show_tree_first(root_node);break;case 'b':Show_tree_middle(root_node);break;case 'c':Show_tree_back(root_node);break;case 'd':cout<<"The depth of this tree is :"<<Tree_depth(root_node)<<endl;break;case 'e':char temp_char4;cout<<"Give me the data of the node you want to find ";cin>>temp_char4;if(Find_node(root_node,temp_char4)){cout<<"This node is in this tree"<<endl;}else{cout<<"This node is not in this tree"<<endl;}break;default:cout<<"Must be in a ~ f"<<endl;break;}}}cout<<"This tree has been deleted "<<endl;}if (temp_char2 == 'b'){char temp_char3;cout<<"Please select mode of operation: "<<endl;cout<<"a: pre_order traverse "<<endl;cout<<"b: in_order traverse  "<<endl;cout<<"c: post_order traverse"<<endl;cin>>temp_char3;switch (temp_char3){case 'a' :Show_tree_first(root_node);break;case 'b':Show_tree_middle(root_node);break;case 'c':Show_tree_back(root_node);break;default:break;}}Clear_tree(root_node);}else if (temp_char1 != 'b'){cout<<"a or b ?"<<endl;}} while (temp_char1 != 'b');cout<<"@@Bye@@"<<endl;system("pause");return 0;}



1 0
原创粉丝点击