自己按照书上说的写的二叉树,实现了接口不知道效率怎样
/*
* BiTree.h
*
* Created on: 2016年3月3日
* Author: Administrator
*/
#ifndef BITREE_H_
#define BITREE_H_
#include<cstdlib>
#include<iostream>
using namespace std;
template<class T>
class BiTreeNode {
public:
T data;
BiTreeNode *left;
BiTreeNode *right;
BiTreeNode(T data_) { //构造函数
data = data_;
left = NULL;
right = NULL;
}
void change_data(T data_) { //改变data
data = data_;
return;
}
};
template<class T>
class BiTree {
private:
BiTreeNode<T> *root;
unsigned int size;
public: /*Public Interface*/
BiTree() { //构造函数
size = 0;
root = NULL;
}
BiTree(T data_) {
size = 1;
root = new BiTreeNode<T>(data_);
}
BiTree(BiTree<T> & tree) {
this->root = tree.root;
this->size = tree.size;
}
~BiTree() { //析构函数
this->rem_sub_tree(root); //移除整棵树
}
unsigned int get_size() { //返回节点个数
return size;
}
BiTreeNode<T> * get_root() { //返回root节点
return root;
}
void change_root(T data_) { //改变root的数据
// root->data = data_;
if (root == NULL) {
root = new BiTreeNode<T>(data_);
size++;
}
else {
root->data = data_;
}
return;
}
BiTreeNode<T> * get_left(BiTreeNode<T> * rooted) { //返回某节点的左子节点
return rooted->left;
}
BiTreeNode<T> * get_right(BiTreeNode<T> * rooted) { //返回某节点的又子节点
return rooted->right;
}
bool is_leaf(BiTreeNode<T> * node) { //判断某节点是否为叶子节点
if (node->left == NULL && node->right == NULL) {
return true;
}
return false;
}
T get_data(BiTreeNode<T> * node) { //get某节点的数据
return node->data;
}
void change_data(BiTreeNode<T> *node, T data_) { //修改某节点的数据
// node->data = data_;
node->change_data(data_);
return;
}
bool ins_left(BiTreeNode<T> *rooted, T data_) { //插入数据为data_的节点到rooted的左边
if (rooted->left != NULL) {
return false;
}
BiTreeNode<T> *new_node = new BiTreeNode<T>(data_);
rooted->left = new_node;
size++;
return true;
}
bool ins_right(BiTreeNode<T> *rooted, T data_) { //插入数据为data_的节点到rooted的右边
if (rooted->right != NULL) {
return false;
}
BiTreeNode<T> *new_node = new BiTreeNode<T>(data_);
rooted->right = new_node;
size++;
return true;
}
bool rem_sub_tree(BiTreeNode<T> *rooted) { //移除以rooted为根的子树
if (!rooted) {
return false;
}
if (rooted->left != NULL) {
rem_sub_tree(rooted->left);
}
if (rooted->right != NULL) {
rem_sub_tree(rooted->right);
}
delete rooted;
size--;
return true;
}
bool rem_left(BiTreeNode<T> *rooted) { //移除某节点的左子树
if (!rooted) {
return false;
}
if (this->rem_sub_tree(rooted->left)) {
rooted->left = NULL;
return true;
}
return false;
}
bool rem_right(BiTreeNode<T> *rooted) { //移除某节点的右子树
if (this->rem_sub_tree(rooted->right)) {
rooted->right = NULL;
return true;
}
return false;
}
friend BiTree<T> * merage(BiTree<T> &tree1,BiTree<T> &tree2, T data_) { //合并两棵树,这里有过BUG
BiTree<T>* tree = new BiTree<T>(data_); //原本的BiTree<T> tree 是存储在堆内的变量,函数运行结束后,编译器通过用户自己定义的析构函数释放掉内存引起错误,所以写一个什么都不做的析构函数也是可以的
tree->root->left = tree1.get_root();
tree->root->right = tree2.get_root();
tree->size += (tree1.size + tree2.size);
return tree;//运行这句话的时候,tree被释放导致BUG,我的解决方案是定义一个什么都不干的析构函数,笑哭!
/*解决方案2, 把原来的BiTree<T> tree 改成 BiTree<T> *tree3,返回指针的话不会出现问题*/
}
void output(BiTreeNode<T> * rooted) {
if (rooted->left != NULL) {
output(rooted->left);
}
if (rooted->right != NULL) {
output(rooted->right);
}
cout << rooted->data << endl;
return;
}
};
#endif /* BITREE_H_ */
merage这个接口写的时候出现了很多问题,原因是是返回了局部变量。后来发现是内存释放了,查了几种方法
这个总结的很好
http://www.samirchen.com/function-returns/