数据结构之二叉树

自己按照书上说的写的二叉树,实现了接口不知道效率怎样

/*
 * 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值