面向对象:二叉树的基本操作遍历·排序插入·普通插入(c++实现)

写在前面:

这个主要是备考而写,可能有些粗糙,见谅见谅~

对于二叉树,

最根本还是弄清楚 二叉树这个数据结构二叉树结点 它俩的关系,结点就是我们的数据,二叉树这个数据结构是“操作”这些结点,所以你如果用面向对象来写,应该是两个类: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结构体内部,见谅见谅

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值