【 C++ 】 实现 有序二叉树 ( 左>中>右 ) binary tree 类

VBinaryTree.h

cpp 复制代码
#ifndef __V_BINARY_TREE__
#define __V_BINARY_TREE__

typedef void(*BinaryTreeMitFun)(int);

struct stBinaryTreeNode;

class VBinaryTree
{
public:
	VBinaryTree(void) { VBinaryTreeInit(); }
	~VBinaryTree(void) { VBinaryTreeDeInit(); }

	// 树的初始化
	void VBinaryTreeInit(void);
	// 树的销毁
	void VBinaryTreeDeInit(void);
	// 在树中搜寻某一结点
	VBinaryTree& VBinaryTreeSearch(int);
	// 在树中插入节点
	bool VBinaryTreeInsert(int);
	// 对树的每个节点的元素使用某种函数
	void VBinaryTreeMiter(BinaryTreeMitFun);

private:
	stBinaryTreeNode* m_pnode;
};

struct stBinaryTreeNode
{
	int val;
	VBinaryTree left;
	VBinaryTree right;
};

#endif

VBinaryTree.c

cpp 复制代码
#include "VBinaryTree.h"

void VBinaryTree::VBinaryTreeInit(void)
{
	m_pnode = NULL;
}


// 通过后续遍历节点,来销毁节点,先左节点,再右节点,最后中间节点(左右中)
void VBinaryTree::VBinaryTreeDeInit(void)
{
	// 当前节点为空直接退出
	if( !m_pnode )
	{
		return;
	}
	// 通过迭代的方式删除,先左再右最后自己
	m_pnode->left.VBinaryTreeDeInit();
	m_pnode->right.VBinaryTreeDeInit();

	delete (m_pnode);
	m_pnode = NULL;
}

// 在有序二叉树(左<中<右)中搜寻节点,通过对照val来查找
VBinaryTree& VBinaryTree::VBinaryTreeSearch(int val)
{
	// 没找到节点,进入死胡同
	if( !m_pnode )
	{
		return (VBinaryTree&)(*this);
	}

	// 当前节点是要找的节点
	if( m_pnode->val == val )
	{
		return (VBinaryTree&)(*this);
	}
	// 往左查找
	else if( m_pnode->val > val )
	{
		return m_pnode->left.VBinaryTreeSearch(val);
	}
	else
	{
		return m_pnode->right.VBinaryTreeSearch(val);
	}
}


bool VBinaryTree::VBinaryTreeInsert(int val)
{
	// 获取新插入的节点应该插入的位置
	VBinaryTree* p_tree = &(VBinaryTreeSearch(val));

	// 当节点存在时
	if( p_tree->m_pnode )
	{
		return 1;
	}
	else
	{
		p_tree->m_pnode = new stBinaryTreeNode;
		
		// 创建失败
		if( !p_tree->m_pnode )
		{
			return 1;
		}
		else
		{
			p_tree->m_pnode->val = val;
			// 给左右赋值为空,防止野指针出现
			p_tree->m_pnode->left.m_pnode = NULL;
			p_tree->m_pnode->right.m_pnode = NULL;
			
			return 0;
		}
	}
}

// 中序遍历来处理节点(左中右)
void VBinaryTree::VBinaryTreeMiter(BinaryTreeMitFun pFun)
{
	// 节点为空退出
	if( !m_pnode )
	{
		return;
	}
	
	m_pnode->left.VBinaryTreeMiter(pFun);
	pFun(m_pnode->val);
	m_pnode->right.VBinaryTreeMiter(pFun);
}

main.c

cpp 复制代码
#include "iostream"
#include "VBinaryTree.h"

using namespace std;

void myPrint(int a)
{
	cout << a << " ";
}

int main(void)
{
	VBinaryTree myTree;
	
	for( int i=0; i<10; i++ )
	{
		myTree.VBinaryTreeInsert(i);
	}
	myTree.VBinaryTreeMiter(myPrint);
	cout << "" << endl;
	
	myTree.VBinaryTreeDeInit();
	
	myTree.VBinaryTreeInsert(2);
	myTree.VBinaryTreeInsert(2321);
	myTree.VBinaryTreeInsert(-2);
	myTree.VBinaryTreeInsert(30);

	myTree.VBinaryTreeMiter(myPrint);
	cout << "" << endl;

	return 0;
}
相关推荐
rqtz6 分钟前
【C++面向对象】封装(下):探索C++运算符重载设计精髓
开发语言·c++·运算符重载
小c君tt14 分钟前
qt/C++面试题自用学习(更新中)
c++·qt·学习·面试
柯ran1 小时前
数据结构|排序算法(三)选择排序 堆排序 归并排序
数据结构·算法·排序算法
愚润求学1 小时前
【专题刷题】双指针(三):两数之和,三数之和,四数之和
c++·笔记·leetcode·刷题
无敌的牛1 小时前
滑动窗口209. 长度最小的子数组
数据结构·算法
愚润求学1 小时前
【C++】map和set
开发语言·c++·笔记
末央&2 小时前
【C++】priority_queue的底层封装和实现
开发语言·c++
挽天java2 小时前
数据结构习题--岛屿数量
数据结构
别来无恙2022 小时前
数据结构(6)
c语言·数据结构
superior tigre2 小时前
C++学习:六个月从基础到就业——面向对象编程:虚函数与抽象类
开发语言·c++·学习