C++实现二叉树
- 实现二叉树的初始化。
- 实现二叉树的尾部增加,删除,查找某一节点的父节点,左孩子,右孩子,左兄弟,右兄弟结点。
- 实现先序遍历,中序遍历及后序遍历。
实现代码:
#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;
}
该博客介绍了如何使用C++模板类实现动态二叉树,包括初始化、尾部节点添加、删除、查找节点及其父节点、子节点、兄弟节点等操作。此外,还提供了先序、中序和后序遍历的方法,并给出了主函数示例。
8866

被折叠的 条评论
为什么被折叠?



