建立二叉排序树,实现树的插入、删除,前、中、后序遍历(递归方式)等操作。
- #include <iostream>
- #include "Binary_Tree.h"
- using namespace std;
- int main()
- {
- int N = 0;
- int *data;
- cout << "N = ";
- cin >> N;
- data = (int *)malloc(N * sizeof(int));
- cout << "数据:";
- for (int i = 0; i < N; ++i)
- {
- cin >> data[i];
- }
- //30 12 54 8 24 35 70 19 28 48
- //30 12 54 24 35 70 19 28 48 37 36 38
- BT BTree;
- BTree.Create_Binary_Sort_Tree(data, N);
- while(1)
- {
- cout << "1.遍历\t2.插入\t3.删除\t4.退出"<<endl;
- cout <<"选择:";
- int choice;
- cin >> choice;
- switch(choice)
- {
- case 1:
- cout << "前序:";
- BTree.Pre_Oder_Traverse(BTree.root);
- cout << endl;
- cout << "中序:";
- BTree.In_Oder_Traverse(BTree.root);
- cout << endl;
- cout << "后序:";
- BTree.Post_Oder_Traverse(BTree.root);
- cout << endl;
- break;
- case 2:
- cout << "插入:";
- int value;
- cin >> value;
- BTree.Insert_Elem(value);
- break;
- case 3:
- cout << "删除:";
- cin >> value;
- BTree.Delete_Elem(value);
- break;
- case 4:
- return 0;
- break;
- default:
- break;
- }
- }
- return 0;
- }
- /*****************************************
- Copyright (c) 2015 Jingshuang Hu
- @filename:Binary_Tree.h
- @datetime:2015.11.03
- @author:HJS
- @e-mail:eleftheria@163.com
- @blog:http://blog.csdn.net/hujingshuang
- *****************************************/
- #ifndef _BINARY_TREE_H_
- #define _BINARY_TREE_H_
- #include <iostream>
- using namespace std;
- struct Tree
- {
- int elem;
- Tree *left;
- Tree *right;
- };
- class BT
- {
- public:
- BT(); //构造函数
- void Create_Binary_Sort_Tree(int *, int); //建立二叉树
- void Pre_Oder_Traverse(Tree *); //前序
- void In_Oder_Traverse(Tree *); //中序
- void Post_Oder_Traverse(Tree *); //后序
- void Insert_Elem(int); //插入
- void Delete_Elem(int); //删除
- // void Show_Tree(void); //显示二叉树
- // virtual void Level_Oder_Traverse(Tree *) = 0; //纯虚函数
- //private:
- Tree *root;
- };
- #endif
- /*****************************************
- Copyright (c) 2015 Jingshuang Hu
- @filename:Binary_Tree.cpp
- @datetime:2015.11.03
- @author:HJS
- @e-mail:eleftheria@163.com
- @blog:http://blog.csdn.net/hujingshuang
- *****************************************/
- #include "Binary_Tree.h"
- //初始化二叉树
- BT::BT()
- {
- root = NULL;
- }
- //建立二叉树
- void BT::Create_Binary_Sort_Tree(int *data, int N)
- {
- Tree *nowfreenode = new Tree; //生成新的节点
- Tree *prefreenode = new Tree;
- root = new Tree;
- root->elem = data[0]; //父节点元素
- root->left = root->right = NULL; //左右孩子为空
- //30 12 54 8 24 35 70 19 28 48
- for (int i = 1; i < N; ++i)
- {
- nowfreenode = root;
- Tree *newnode = new Tree; //生成新的节点
- newnode->elem = data[i];
- newnode->left = newnode->right = NULL;
- while(nowfreenode != NULL) //空
- {
- prefreenode = nowfreenode; //用于记录前一个节点
- if (newnode->elem < nowfreenode->elem) //挂在左边
- {
- nowfreenode = nowfreenode->left;
- }
- else
- {
- nowfreenode = nowfreenode->right; //挂在右边
- }
- }
- if (newnode->elem < prefreenode->elem)
- {
- prefreenode->left = newnode;
- }
- else
- {
- prefreenode->right = newnode;
- }
- }
- delete nowfreenode;
- // delete prefreenode;
- }
- //前序
- void BT::Pre_Oder_Traverse(Tree *T)
- {
- if (T != NULL)
- {
- cout << T->elem << " ";
- Pre_Oder_Traverse(T->left);
- Pre_Oder_Traverse(T->right);
- }
- }
- //中序
- void BT::In_Oder_Traverse(Tree *T)
- {
- if (T != NULL)
- {
- In_Oder_Traverse(T->left);
- cout << T->elem << " ";
- In_Oder_Traverse(T->right);
- }
- }
- //后序
- void BT::Post_Oder_Traverse(Tree *T)
- {
- if (T != NULL)
- {
- Post_Oder_Traverse(T->left);
- Post_Oder_Traverse(T->right);
- cout << T->elem << " ";
- }
- }
- //插入
- void BT::Insert_Elem(int data)
- {
- Tree *nowfreenode = new Tree;
- Tree *prefreenode = new Tree;
- nowfreenode = root;
- Tree *newnode = new Tree; //生成新的节点
- newnode->elem = data;
- newnode->left = newnode->right = NULL;
- while(nowfreenode != NULL) //空
- {
- prefreenode = nowfreenode; //用于记录前一个节点
- if (newnode->elem < nowfreenode->elem) //挂在左边
- {
- nowfreenode = nowfreenode->left;
- }
- else
- {
- nowfreenode = nowfreenode->right; //挂在右边
- }
- }
- if (newnode->elem < prefreenode->elem)
- {
- prefreenode->left = newnode;
- }
- else
- {
- prefreenode->right = newnode;
- }
- }
- //删除
- void BT::Delete_Elem(int data)
- {
- Tree *prefreenode = new Tree;
- Tree *nowfreenode = new Tree;
- nowfreenode = root;
- Tree *newnode = new Tree;
- newnode->elem = data;
- newnode->left = newnode->right = NULL;
- prefreenode = nowfreenode;
- //找到元素所在节点nowfreenode
- while((nowfreenode != NULL) && (newnode->elem != nowfreenode->elem))
- {
- prefreenode = nowfreenode;
- if (newnode->elem < nowfreenode->elem) //往左走
- {
- nowfreenode = nowfreenode->left;
- }
- else if (newnode->elem > nowfreenode->elem) //往右走
- {
- nowfreenode = nowfreenode->right;
- }
- }
- //
- if ((nowfreenode->left != NULL) && (nowfreenode->right == NULL))//只有左子树,用左子树代替节点
- {
- if ((prefreenode->left != NULL) && (prefreenode->left->elem == nowfreenode->elem))
- {
- prefreenode->left = nowfreenode->left;
- }
- else
- {
- if (prefreenode == nowfreenode)
- {
- root = nowfreenode->left;
- }
- else
- {
- prefreenode->right = nowfreenode->left;
- }
- }
- }
- else if ((nowfreenode->left == NULL) && (nowfreenode->right != NULL))//只有右子树,用右子树代替节点
- {
- if ((prefreenode->left != NULL) && (prefreenode->left->elem == nowfreenode->elem))
- {
- prefreenode->left = nowfreenode->right;
- }
- else
- {
- if (prefreenode == nowfreenode)
- {
- root = nowfreenode->right;
- }
- else
- {
- prefreenode->right = nowfreenode->right;
- }
- }
- }
- else if ((nowfreenode->left == NULL) && (nowfreenode->right == NULL))//是叶子节点,直接删除
- {
- if ((prefreenode->left != NULL) && (prefreenode->left->elem == nowfreenode->elem))
- prefreenode->left = NULL;
- else
- prefreenode->right = NULL;
- }
- else//左右子树都存在,用左子树最右节点代替节点
- {
- prefreenode = nowfreenode;
- nowfreenode = nowfreenode->left;
- Tree *pfreenode = prefreenode;
- while(nowfreenode->right != NULL)
- {
- pfreenode = nowfreenode;
- nowfreenode = nowfreenode->right;
- }
- prefreenode->elem = nowfreenode->elem;
- pfreenode->right = nowfreenode->left;
- delete prefreenode;
- }
- // delete nowfreenode;
- }