C++ 数组实现二叉树

用数组实现二叉树 ,关键是用父节点的*2+1表示左儿子,父节点的*2+2表示右节点

 

Tree.h

#pragma once
class Tree
{
private:
	int *m_pTree;
	int m_iSize;

public:
	Tree(int size,int *pRoot);                                    
	~Tree();
	int* SearchNode(int nodeIndex);                               // 查找结点
	bool AddNode(int nodeIndex, int direction, int *pNode);       // 添加一个结点
	bool DeleteNode(int nodeIndex, int *pNode);                   // 删除几点
	void TreeTraverse();                                          // 二叉树的遍历
};

Tree.cpp

#include<iostream>

Tree::Tree(int size, int *pRoot)
{
	m_iSize = size;
	m_pTree = new int[size];
	for (int i = 0; i < size; i++)
	{
		m_pTree[i] = 0;
	}
	m_pTree[0] = *pRoot;
}


Tree::~Tree()
{
	delete[]m_pTree;
	m_pTree = NULL;
}

int *Tree::SearchNode(int nodeIndex)
{
	if (nodeIndex < 0 || nodeIndex >= m_iSize)
		return NULL;
	if (m_pTree[nodeIndex] == 0)
		return NULL;
	return &m_pTree[nodeIndex];
	
}

bool Tree::AddNode(int nodeIndex, int direction, int *pNode)
{
	if (nodeIndex < 0 || nodeIndex >= m_iSize)
		return false;
	if (m_pTree[nodeIndex] == 0)
		return false;
	if (direction == 0)
	{
		if (nodeIndex*2+1 >= m_iSize)
			return false;
		if (m_pTree[nodeIndex*2+1]!=0)
			return false;
		m_pTree[nodeIndex * 2 + 1] = *pNode;
	}
	if (direction==1)
	{
		if (nodeIndex * 2 + 2 >= m_iSize)
			return false;
		if (m_pTree[nodeIndex * 2 + 2] != 0)
			return false;
		m_pTree[nodeIndex * 2 + 2] = *pNode;
	}
	return true;
}

bool Tree::DeleteNode(int nodeIndex, int *pNode)
{
	if (nodeIndex < 0 || nodeIndex >= m_iSize)
		return false;
	if (m_pTree[nodeIndex] == 0)
		return false;

	*pNode = m_pTree[nodeIndex];
	m_pTree[nodeIndex] = 0;
	return true;
}

void Tree::TreeTraverse()
{
	for (int i = 0; i < m_iSize; i++)
	{
		std::cout << m_pTree[i] << " ";
	}
}

测试函数

#include "Tree.h"
#include<iostream>
         
using namespace std;
/*
           3(0)
	5(1)          8(2)

2(3)    6(4)  9(5)     7(6)   
      

*/

int main()
{
	int root = 3;
	Tree *pTree = new Tree(10, &root);
	int node1 = 5;
	int node2 = 8;
	pTree->AddNode(0, 0, &node1);
	pTree->AddNode(0, 1, &node2);
	int node3 = 2;
	int node4 = 6;
	pTree->AddNode(1, 0, &node3);
	pTree->AddNode(1, 1, &node4);
	int node5 = 9;
	int node6 = 7;
	pTree->AddNode(2, 0, &node5);
	pTree->AddNode(2, 1, &node6);

	int node = 0;
	pTree->DeleteNode(6, &node);
	cout << "node" << node << endl;

	pTree->TreeTraverse();

	int *p = pTree->SearchNode(2);
	cout << endl;
	cout << "node=" << *p << endl;

	delete pTree;
    return 0;
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
数组建立二叉树的方法是将二叉树按照完全二叉树的形式存储在数组中。具体步骤如下: 1. 将二叉树的根节点存放在数组的第一个位置,即a[1]。 2. 对于任意一个节点i,其左子节点的位置为2*i,右子节点的位置为2*i+1。 3. 若节点i的位置为j,则其父节点的位置为j/2(向下取整)。 4. 从第二个位置开始,依次输入二叉树的节点,若节点不存在则输入0。 例如,以下二叉树: ``` 1 / \ 2 3 / \ / \ 4 5 6 7 ``` 可以用数组表示为: ``` a[1] = 1 a[2] = 2 a[3] = 3 a[4] = 4 a[5] = 5 a[6] = 6 a[7] = 7 ``` 其中,a[1]为根节点,a[2]和a[3]为其左右子节点,a[4]和a[5]为节点2的左右子节点,a[6]和a[7]为节点3的左右子节点。 建立二叉树的代码示例: ``` #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; TreeNode *buildTree(int *a, int n, int i) { if (i > n || a[i] == 0) { // 超出数组范围或节点为空 return NULL; } TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = a[i]; root->left = buildTree(a, n, 2*i); root->right = buildTree(a, n, 2*i+1); return root; } int main() { int a[] = {0, 1, 2, 3, 4, 5, 6, 7}; int n = sizeof(a) / sizeof(int) - 1; TreeNode *root = buildTree(a, n, 1); return 0; } ``` 其中,buildTree函数用于建立二叉树,参数a为表示二叉树数组,n为数组长度,i为当前节点在数组中的位置。函数会根据数组中的数值创建节点,并递归创建其左右子树。最后返回根节点。在主函数中,先计算数组长度n,然后调用buildTree函数建立二叉树

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值