c++实现二叉树的插入、删除、查询、遍历和树形打印

这篇博客介绍了如何使用C++实现二叉树的基本操作,包括节点的插入、删除、查询以及中序遍历。通过`binary_tree.h`、`main.cpp`和`util.h`三个文件展示了具体实现,并强调模板类的声明和实现必须在同一文件内,以避免链接错误。

binary_tree.h

声明

#ifndef BINARY_TREE
#define BINARY_TREE

#include "util.h"

template<typename T>
class tree_node {
public:
	tree_node(T key_):key(key_), parent(NULL), left_child(NULL), right_child(NULL) {};
	T get_key();
	tree_node* get_parent();
	tree_node* get_left_child();
	tree_node* get_right_child();
	void set_parent(tree_node* p);
	void set_left_child(tree_node* lc);
	void set_right_child(tree_node* rc);
private:
	T key;
	tree_node* parent;
	tree_node* left_child;
	tree_node* right_child;
};

template<typename T>
class binary_tree {
public:
	binary_tree():root(NULL), size(0), max_key_length(0), change(false) {};
	void inorder_tree_walk(tree_node<T>* r) const;  //输出中序遍历
	void preorder_tree_walk(tree_node<T>* r) const; //输出前序遍历
	void postorder_tree_walk(tree_node<T>* r) const; //输出后序遍历
	tree_node<T>* search(tree_node<T>* x, T k) const; //查找键值为k的结点
	tree_node<T>* min_node(tree_node<T>* x) const; //返回键值最小的结点
	tree_node<T>* max_node(tree_node<T>* x) const; //返回键值最大的结点
	tree_node<T>* successor_node(tree_node<T>* x) const; //返回下一个结点,即最小的比当前结点键值大的结点
	tree_node<T>* get_root() const; //获取根节点
	void tree_insert(tree_node<T>* z); // 插入结点
	void tree_delete(tree_node<T>* z); // 删除结点
	void print_tree(); // 按树状打印二叉树
	int tree_size() const; // 结点个数
	int tree_height(tree_node<T>* r) const; //树高
private:
	void transplant(tree_node<T>* u, tree_node<T>* v);  //用v为根的子树替换u为根的子树
	void find_nodes_indexes(tree_node<T>* r, int layer); //计算每个结点的横纵坐标,用于树形打印
	int get_max_key_length() const; //获取键的最大长度,用于打印
	int size; //节点个数
	int max_key_length; //键的最大长度
	tree_node<T>* root; //根结点指针
	map<tree_node<T>*, pair<int, int> > nodes_indexes; //结点指针与其横纵坐标的对应
	bool change; //与上次树形打印时相比,二叉树是否发生了变化
};

实现

/*=================实现=====================*/

/*****tree_node*****/

template<typename T>
T tree_node<T>::get_key() {
	return key;
}

template<typename T>
tree_node<T>* tree_node<T&g
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值