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

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>::get_p
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来为您解答。二叉树是一种非常常见的数据结构,它由一个节点以及每个节点最多有两个子节点组成。下面是用C++实现二叉树的建立与遍历的示例代码: ```c++ #include<iostream> using namespace std; // 定义二叉树结点 struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x):val(x),left(NULL),right(NULL){} }; // 创建二叉树 void createTree(TreeNode* &root){ int val; cin>>val; if(val == -1){ // 输入-1表示该节点为空 root = NULL; return; } root = new TreeNode(val); // 创建新节点 createTree(root->left); // 递归创建左子树 createTree(root->right); // 递归创建右子树 } // 前序遍历 void preOrder(TreeNode* root){ if(root == NULL){ return; } cout<<root->val<<" "; // 先输出节点 preOrder(root->left); // 再遍历左子树 preOrder(root->right); // 最后遍历右子树 } // 中序遍历 void inOrder(TreeNode* root){ if(root == NULL){ return; } inOrder(root->left); // 先遍历左子树 cout<<root->val<<" "; // 再输出节点 inOrder(root->right); // 最后遍历右子树 } // 后序遍历 void postOrder(TreeNode* root){ if(root == NULL){ return; } postOrder(root->left); // 先遍历左子树 postOrder(root->right); // 再遍历右子树 cout<<root->val<<" "; // 最后输出节点 } int main(){ TreeNode* root; createTree(root); // 创建二叉树 cout<<"前序遍历结果:"; preOrder(root); // 前序遍历 cout<<endl<<"中序遍历结果:"; inOrder(root); // 中序遍历 cout<<endl<<"后序遍历结果:"; postOrder(root); // 后序遍历 cout<<endl; return 0; } ``` 以上代码中,我们利用递归实现二叉树的创建、前序遍历中序遍历和后序遍历。其中,createTree函数用于创建二叉树,-1代表该节点为空;preOrder、inOrder和postOrder分别用于前序遍历中序遍历和后序遍历,输出节点的值即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值