【 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;
}
相关推荐
浪浪小洋3 小时前
c++ qt课设定制
开发语言·c++
charlie1145141913 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler013 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
故事和你913 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
破浪前行·吴5 小时前
数据结构概述
数据结构·学习
香蕉鼠片5 小时前
MFC是什么
c++·mfc
心态与习惯6 小时前
Julia 初探,及与 C++,Java,Python 的比较
java·c++·python·julia·比较
小欣加油6 小时前
leetcode2078 两栋颜色不同且距离最远的房子
数据结构·c++·算法·leetcode·职场和发展
我真不是小鱼6 小时前
cpp刷题打卡记录30——轮转数组 & 螺旋矩阵 & 搜索二维矩阵II
数据结构·c++·算法·leetcode
南境十里·墨染春水7 小时前
C++ 笔记 thread
java·开发语言·c++·笔记·学习