c++实现二叉树

该博客介绍了如何使用C++模板类实现动态二叉树,包括初始化、尾部节点添加、删除、查找节点及其父节点、子节点、兄弟节点等操作。此外,还提供了先序、中序和后序遍历的方法,并给出了主函数示例。

C++实现二叉树

  1. 实现二叉树的初始化。
  2. 实现二叉树的尾部增加,删除,查找某一节点的父节点,左孩子,右孩子,左兄弟,右兄弟结点。
  3. 实现先序遍历,中序遍历及后序遍历。

实现代码:

#pragma once

template <typename T>
class CMyTree_Arr {
	T		*pBuff;
	size_t	len;
	size_t	maxSize;
public:
	CMyTree_Arr() {
		pBuff = nullptr;
		len = maxSize = 0;
	}
	~CMyTree_Arr() {
		clear();
	}
public:
	void clear() {
		if (pBuff) {
			delete[] pBuff;
		}
		pBuff = nullptr;
		len = maxSize = 0;
	}

	bool find(T const& findVal) const {
		return _find(findVal) != -1;
	}

	void appendNode(T const& data) {	//尾部追加
		if (len >= maxSize) {
			maxSize = maxSize + ((maxSize >> 1) > 1 ? (maxSize >> 1) : 1);
			T* temp = new T[maxSize];
			for (size_t i = 0; i < len; ++i) {
				temp[i] = pBuff[i];
			}
			if (pBuff) {
				delete[] pBuff;
			}
			pBuff = temp;
		}
		pBuff[len++] = data;
	}

	void initTree(T arr[], int length) {	//数组初始化数组
		clear();
		if (length > 0){
			maxSize = len = length;
			pBuff = new T[maxSize];
			for (size_t i = 0; i < length; ++i) {
				pBuff[i] = arr[i];
			}
		}
	}

	void printfTree() {
		_printfTree(0);//根节点下标0开始
	}

	T getLeftChildVal(int index) const {	//得到左子树的元素
		if ((2 * index + 1) >= len || index < 0) {
			throw "out_range";
		}
		return pBuff[2 * index + 1];
	}
	T getRightChildVal(int index) const {	//得到右子树的元素
		if ((2 * index + 2) >= len || index < 0) {
			throw "out_range";
		}
		return pBuff[2 * index + 2];
	}
	T getParentVal(int index) const {	//得到父亲的元素
		if ((index - 1) < 0 || index>=len ) {
			throw "out_range";
		}
		return pBuff[(index - 1) >> 1];
	}
	T getLeftBrotherVal(int index) const {	//得到左兄弟的元素
		if (index <= 0 || index >= len) {
			throw "out_range";
		}
		if (index % 2 == 1) {
			throw "isleft";
		}
		return pBuff[index - 1];
	}
	T getRightBrotherVal(int index) const {	//得到右兄弟的元素
		if (index <= 0 || index >= len) {
			throw "out_range";
		}
		if (index % 2 == 0) {
			throw "isright";
		}
		return pBuff[index + 1];
	}

private:
	int _find(T const& findVal) const {
		for (size_t i = 0; i < len; ++i) {
			if (pBuff[i] == findVal) {
				return i;
			}
		}
		return -1;
	}

	void _printfTree(int index) {
		if (index < len) {
			//先序
			printf("%d\n", pBuff[index]);
			_printfTree(index * 2 + 1);
			_printfTree(index * 2 + 2);

			////中序
			//_printfTree(index * 2 + 1);
			//printf("%d\n", pBuff[index]);
			//_printfTree(index * 2 + 2);

			////后序
			//_printfTree(index * 2 + 1);
			//_printfTree(index * 2 + 2);
			//printf("%d\n", pBuff[index]);
		}
	}
};

主函数代码:

#include "myTree_Arr.h"
int _tmain(int argc, _TCHAR* argv[])
{
	CMyTree_Arr<int> mt;
	int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	mt.appendNode(3);
	mt.initTree(arr, 10);
	mt.printfTree();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海螺蜜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值