二叉树操作
#include <cstring> #include <iostream> #include <stack> #include <queue> using namespace std; class Node { public: char info[50]; Node* left; Node* right; Node(char *i, Node* l, Node* r) { strcpy(info,i); left=l; right=r; } }; class BinarSearchTree { public: Node* ROOT; public: BinarSearchTree():ROOT(NULL){} void insert(char* info); void find(char* info, Node** parent, Node** location); void inorder(Node* ptr); void preorder(Node* ptr); void postorder(Node* ptr); void levelorder(Node* ptr);//层序遍历 void remove(); void case_1(Node* parent, Node* current); void case_2(Node* parent, Node* current); void case_3(Node* parent, Node* current); }; void BinarSearchTree::find(char* info, Node**parent, Node **currentNode) { *currentNode=ROOT; *parent=NULL; while((*currentNode!=NULL) && (strcmp((*currentNode)->info, info)!=0)) { *parent=*currentNode; if(strcmp(info, (*currentNode)->info)<0) *currentNode=(*currentNode)->left; else *currentNode=(*currentNode)->right; } } void BinarSearchTree::insert(char* info) { Node* parent=NULL; Node* currentNode=NULL; Node* temp=NULL; find(info,&parent,¤tNode); if(currentNode!=NULL) { cout<<"\nDuplicate words not allowed"; return; } else { temp=new Node(info,NULL,NULL); if(parent==NULL) ROOT=temp; else if(strcmp(info,parent->info)<0) parent->left=temp; else parent->right=temp; } } void BinarSearchTree::preorder(Node* ptr) { if(ptr!=NULL) { cout<<ptr->info<< " "; preorder(ptr->left); preorder(ptr->right); } } //前序遍历打印每个节点的高度 void preorder(Node* ptr, int depth) { if(ptr!=NULL) { cout<<ptr->info<< depth << " "; preorder(ptr->left, depth+1); preorder(ptr->right, depth+1); } } //前序遍历非递归实现 void preorderNorecu(Node* tree) { stack<Node*> stacks; if(tree!=NULL) { while(tree || !stacks.empty()) { while(tree) { stacks.push(tree); cout << tree->info << " "; tree=tree->left; } tree = stacks.top(); stacks.pop(); tree=tree->right; } } } void BinarSearchTree::inorder(Node* ptr) { if(ptr!=NULL) { inorder(ptr->left); cout<<ptr->info<<" "; inorder(ptr->right); } } //中序遍历非递归实现 void inorderNorecu(Node* tree) { stack<Node*> stacks; if(tree!=NULL) { while(tree || !stacks.empty()) { while(tree) { stacks.push(tree); tree=tree->left; } tree = stacks.top(); stacks.pop(); cout << tree->info << " "; tree=tree->right; } } } void BinarSearchTree::postorder(Node* ptr) { if(ptr!=NULL) { postorder(ptr->left); postorder(ptr->right); cout << ptr->info << " "; } } //后序遍历非递归实现 void postorderNorecu(Node* ptr) { } //层序遍历 void BinarSearchTree::levelorder(Node* ptr) { queue<Node*> stacks; if(ptr!=NULL) { stacks.push(ptr); while(!stacks.empty()) { Node* node = stacks.front(); stacks.pop(); cout << node->info << " "; if(node->left!=NULL) stacks.push(node->left); if(node->right!=NULL) stacks.push(node->right); } } } //计算节点总数 int coutNodeNum(Node* tree) { if(tree==NULL) return 0; else if(tree->left==NULL&&tree->right==NULL) return 1; else return coutNodeNum(tree->left)+coutNodeNum(tree->right)+1; } //树高度 int treeDepth(Node* tree) { if(tree==NULL) return 0; else { int leftdepth = treeDepth(tree->left); int rightdepth = treeDepth(tree->right); return 1+ (leftdepth>rightdepth?leftdepth:rightdepth); } } void BinarSearchTree::remove() { if(ROOT==NULL) /* Checks whether the tree is empty */ { cout<<"\nTree is empty\n"; return; } Node *parent,*currentNode; char element[50]; cout<<"\nEnter the word to be deleted: "; cin>>element; find(element,&parent,¤tNode); if(currentNode==NULL) { cout<<"\nWord not found in the dictionary"<<endl; return; } if (currentNode->left==NULL && currentNode->right==NULL)//叶子节点 { case_1(parent,currentNode); } else if (currentNode->left!=NULL && currentNode->right==NULL)//含左子树 { case_2(parent,currentNode); } else if (currentNode->left==NULL && currentNode->right!=NULL)//含右子树 { case_2(parent,currentNode); } else//含左右子树 case_3(parent,currentNode); } //叶子节点 void BinarSearchTree::case_1(Node* parent, Node* current) { if (parent==NULL) { ROOT=NULL; } else { if(current==parent->left) parent->left=NULL; else parent->right=NULL; } delete current; } //含左子树或者右子树 void BinarSearchTree::case_2(Node* parent, Node* current) { Node* child; if(current->left!=NULL) child=current->left; else child=current->right; if(parent==NULL) ROOT=child; else if(current==parent->left) parent->left=child; else parent->right=child; delete current; } //含左右子树 void BinarSearchTree::case_3(Node* parent, Node* current) { Node* inorder_suc, *inorder_parent; inorder_parent = current; inorder_suc=current->right; while(inorder_suc->left!=NULL) { inorder_parent=inorder_suc; inorder_suc=inorder_suc->left; } strcpy(current->info, inorder_suc->info); if(inorder_suc->left==NULL && inorder_suc->right==NULL) case_1(inorder_parent,inorder_suc); else case_2(inorder_parent,inorder_suc); } //最大深度 int maxDepth(Node* root) { if (root == NULL) { return 0; } else { int leftdepth = maxDepth(root->left); int rightdepth = maxDepth(root->right); return 1+ (leftdepth>rightdepth?leftdepth:rightdepth); } } //最小深度 int minDepth(Node* root) { if (root == NULL) { return 0; } else { int leftdepth = minDepth(root->left); int rightdepth = minDepth(root->right); return 1+ (leftdepth<rightdepth?leftdepth:rightdepth); } } //判断是否是平衡二叉树 bool isbalanceTree(Node* tree) { if (tree==NULL) return true; else { int maxdepth = maxDepth(tree); int mindepth = minDepth(tree); return (maxdepth-mindepth)<=1; } } //比较树是否相等 int compTree(Node *tree1, Node *tree2) { if(tree1==NULL &&tree2==NULL) return 1; if(tree1==NULL || tree2==NULL) return 0; if(strcmp(tree1->info,tree2->info)!=0) return 0; if(compTree(tree1->left,tree2->left)&&compTree(tree1->right,tree2->right)|| compTree(tree1->left,tree2->right)&&compTree(tree1->right,tree2->left)) return 1; return 0; } //根据前序创建二叉树 void createTreeByPreorder(Node* &node, char *arr, int ¤t) { if(arr[current]=='#') node=NULL; else { char arr2[2]={arr[current],'\0'}; node = new Node(arr2, NULL, NULL); createTreeByPreorder(node->left,arr,++current); createTreeByPreorder(node->right,arr,++current); } } //根据层序创建二叉树 void createTreeByLevelorder(Node* &node, char *arr, int current) { if(arr[current]=='#') node=NULL; else { char arr2[2]={arr[current],'\0'}; node = new Node(arr2, NULL, NULL); createTreeByLevelorder(node->left,arr,2*current+1); createTreeByLevelorder(node->right,arr,2*current+2); } } //根据后续遍历创建树,左右根->根右左 void createTreeByPostorder(Node* &node, char *arr, int ¤t) { if(arr[current]=='#') node=NULL; else { char arr2[2]={arr[current],'\0'}; node = new Node(arr2, NULL, NULL); createTreeByPreorder(node->right,arr,++current); createTreeByPreorder(node->left,arr,++current); } } //根据前序中序创建二叉树 void createTreeByPreInOrder(Node* &node, char *preorder, char* inorder, int len) { if (len<=0) { node=NULL; return; } else { char arr2[2]={preorder[0],'\0'}; node = new Node(arr2, NULL, NULL); for(char* temp=inorder;temp<inorder+len;temp++) if(*temp==preorder[0]) break; int k=temp-inorder; createTreeByPreInOrder(node->left,preorder+1,inorder,k); createTreeByPreInOrder(node->right,preorder+1+k,temp+1,len-k-1); } } //根据中序后序创建二叉树 void createTreeByPostInorder(Node* &node, char* postorder, char *inorder, int len) { if (len<=0) { node=NULL; return; } else { char arr2[2]={postorder[len-1],'\0'}; node = new Node(arr2, NULL, NULL); for(char* temp=inorder;temp<inorder+len;temp++) if(*temp==postorder[len-1]) break; int k=temp-inorder; createTreeByPostInorder(node->left,postorder,inorder,k); createTreeByPostInorder(node->right,postorder+k,temp+1,len-k-1); } } //交换左右子树 void change_left_right(Node* &node) { if(node) { change_left_right(node->left); change_left_right(node->right); Node* temp = node->left; node->left=node->right; node->right=temp; } } //打印树 void display(BinarSearchTree& b) { cout << "InOrder: "; b.inorder(b.ROOT); cout << endl; cout << "PreOrder: "; b.preorder(b.ROOT); cout << endl; cout << "PostOrder:"; b.postorder(b.ROOT); cout << endl; cout << "LevelOrder:"; b.levelorder(b.ROOT); cout << endl; } int main() { // char *str[]={"E","B","H","A","C","D","F","G","I","J"}; // BinarSearchTree b; // for (int i=0;i<10;i++) // { // b.insert(str[i]); // } // display(b); // b.remove(); // display(b); // char prorder[]="ABDCE"; // char iorder[]="DBAEC"; // Node *treeroot; // BinarSearchTree b4; // createTreeByPreInOrder(treeroot,prorder,iorder,5); // b4.ROOT=treeroot; // display(b4); // char poorder[]="CGEFDBA"; // char iorder []="CBEGDFA"; // Node *treeroot; // BinarSearchTree b4; // createTreeByPostInorder(treeroot,poorder,iorder,7); // b4.ROOT=treeroot; // display(b4); // cout <<"\n--------------------------------------"; // // char levelorder[]="ABCD#E#######"; // BinarSearchTree b3; // Node *levelroot; // createTreeByLevelorder(levelroot,levelorder,0); // b3.ROOT=levelroot; // display(b3); char arr[]="ABC##DE#G##F###"; //char arr[]="ABDHL###I##E#J##CF#K##G##"; int current=0; Node *root; createTreeByPreorder(root,arr,current); BinarSearchTree b1; b1.ROOT=root; display(b1); cout << endl; preorderNorecu(b1.ROOT); cout << endl; inorderNorecu(b1.ROOT); cout << "\nNodeNum=" << coutNodeNum(b1.ROOT); cout << "\nTreeDepth=" << treeDepth(b1.ROOT); cout << "\n"; preorder(b1.ROOT,1); cout <<"\n"; cout<<isbalanceTree(b1.ROOT); // cout << endl; // // change_left_right(b1.ROOT); // display(b1); // // current=0; // Node *root2; // char arr2[]="A#BDF##EG###C##"; // createTreeByPostorder(root2,arr2,current); // BinarSearchTree b2; // b2.ROOT=root; // display(b2); // // cout << compTree(b1.ROOT,b2.ROOT) <<endl; for (int i=0;i<10;i++) { cout << i << " " ; } return 0; }
posted on 2013-09-11 19:29 Sunny_NUAA 阅读(168) 评论(0) 编辑 收藏 举报