写在前面:
这个主要是备考而写,可能有些粗糙,见谅见谅~
对于二叉树,
最根本还是弄清楚 二叉树这个数据结构 与 二叉树结点 它俩的关系,结点就是我们的数据,二叉树这个数据结构是“操作”这些结点,所以你如果用面向对象来写,应该是两个类:node结点类和binarytree二叉树类。
好了,见代码:
#include<iostream>
#define null NULL
using namespace std;
template<class T>
class treenode {
public:
T data;
treenode* lchild;
treenode* rchild;
treenode(){}
treenode(T data) {
this->data = data;
this->lchild = null;
this->rchild = null;
}
treenode(T data, treenode* lchild, treenode* rchild) {
this->data = data;
this->lchild = lchild;
this->rchild = rchild;
}
};
/*
1、二叉树的插入操作需要指明插入的位置
2、插入操作必须正确处理指向父结点的指针
故时间复杂度最大达O(n)
*/
template<class T>
class tree {//将树的一系列操作封装成类,面向对象
treenode<T>* root_node;
public:
treenode<T>*& get_root_node() {//get方法
return this->root_node;
}
tree() {
this->root_node = new treenode<T>();
}
tree(T data) {
this->root_node = new treenode<T>(data);
}
void Initialization(T data) {
this->root_node = new treenode<T>(data);
}
void PreOrder(treenode<T>*node) {
if (node != null) {
cout << node->data << " ";
if (node->lchild != null)this->PreOrder(node->lchild);
if (node->rchild != null)this->PreOrder(node->rchild);
}
}
void MidOrder(treenode<T>* node) {
if (node != null) {
if (node->lchild != null)this->MidOrder(node->lchild);
cout << node->data << " ";
if (node->rchild != null)this->MidOrder(node->rchild);
}
}
void PostOrder(treenode<T>*node) {
if (node != null) {
if (node->lchild != null)this->PostOrder(node->lchild);
if (node->rchild != null)this->PostOrder(node->rchild);
cout << node->data << " ";
}
}
treenode<T>* SearchNode(treenode<T>*node,T data) {
treenode<T>* temp = null;
if (node->data == data)
return node;
else {
if (node->lchild != null)temp = SearchNode(node->lchild, data);
if (temp == null && node->rchild != null)temp = SearchNode(node->rchild, data);
}
return temp;
}
void Insert_sort(T data,treenode<T> *&node) {//依照二叉排序树的规则进行插入
if (data >= node->data) {
if (node->rchild == null) {
node->rchild = new treenode<T>(data);
}
else {
this->Insert_sort(data, node->rchild);
}
}
else {
if (node->lchild == null) {
node->lchild = new treenode<T>(data);
}
else {
this->Insert_sort(data, node->lchild);
}
}
}
//这个会一般的插入,需要指定插入到哪个结点,以及其左右孩子,我用Boolen类型表示左右孩子
bool Insert_ordinary(T data, T destination_data, treenode<T>*& node,bool RL) {
if (node->data == destination_data) {
if (RL) {
if (node->rchild != null)node->rchild->data = data;
else node->rchild = new treenode<T>(data);
}
else {
if (node->lchild != null)node->lchild->data = data;
else node->lchild = new treenode<T>(data);
}
return true;
}
else {
bool mark = false;
if (node->lchild != null)mark=Insert_ordinary(data, destination_data, node->lchild, RL);
if (!mark && node->rchild != null)mark = Insert_ordinary(data, destination_data, node->rchild, RL);
return mark;
}
}
};
int main() {
tree<int>* mytree = new tree<int>(10);
treenode<int>* root_node = mytree->get_root_node();
mytree->Insert_sort(5,root_node);
mytree->Insert_sort(15, root_node);
mytree->Insert_sort(3, root_node);
mytree->Insert_sort(8,root_node);
mytree->Insert_sort(-4, root_node);
mytree->Insert_sort(16, root_node);
mytree->Insert_sort(12, root_node);
mytree->Insert_sort(11, root_node);
cout << mytree->Insert_ordinary(7, 5, root_node, true)<<endl;
mytree->PreOrder(root_node); cout << endl;
mytree->MidOrder(root_node); cout << endl;
mytree->PostOrder(root_node); cout << endl;
cout << mytree->SearchNode(root_node, 15)->rchild->data << endl;
return 0;
}
//额(⊙o⊙)…,写到最后才发现不应该把root_node封装再tree结构体内部,见谅见谅