数据结构(树)

1、n个结点有限集合,可以为空树,

2、结点的度数:结点子树的个数

3、树叶:没有子树的结点

4、分支结点:非终端结点

5、有序树:树的各节点的儿子都是有序的

6、层数:树根的层数为1

二叉树:

每个结点至多有两个子女

性质:

1、n个结点有n-1条边

2、深度为n的二叉树至多有2^n-1个结点。

3、结点个数为n,深度为h,则

      前面为向上取整  log_2 (n + 1) \leq h \leq n

4、如果二叉树每个分支结点都有两个儿子,叶节点数为n,则分支结点的个数为n - 1

5、二叉树叶结点个数为n0,一个儿子的分支结点数为n1,有两个儿子的为n2,边的数量为e

则 n2 = n0 - 1; e = 2*n2 + n1; e = n0 + n1 + n2 -1

定义:

(1)满二叉树:深度为h且有2^h-1个结点

(2)完全二叉树:存在n个结点的每个结点和满二叉树中编号1-n结点一一对应

性质:

对一个完全二叉树结点,按层次次序编号。

(1)i = 1为根节点,i > 1 则 i / 2向下取整为父母结点

(2)2i > n 则结点无左子女,否则结点2i为i的左子女

(3)2i + 1 > n, 则结点无右子女,否则2i + 1为右子女

二叉树按顺序创建查找父结点(顺序存储的方式)

#include <iostream>
using namespace std;

int main()
{
	int n;
	cin >> n;
	char* x = new char[n];
	for(int i = 1; i <= n; i++)
	{
		cin >> x[i];
	}
	char c;
	cin >> c;
	for(int i = 1; i <= n; i++)
	{
		if(x[i] == c)
		{
			cout << x[i/2];
		}
	}
	return 0;
}
#include <iostream>
using namespace std;
//输入格式结点个数、
template <class T>
class tNode
{
public:
	T data;
	//int id; 可用于编号
	tNode *pL,*pR;//父节点和
};
const int MAXSIZE = 20000;
tNode<int> tree[MAXSIZE];
int N;

int main()
{
	int a, L, R;
	cin >> N;
	for(int i = 0; i < N; i++)
	{
		cin >> a >> L >> R;
		tree[a].data = a;
		if(!L)
			tree[a].pL = NULL;
		else
		{
			tree[a].pL = &tree[L];
		}
		if(!R)
			tree[a].pR = NULL;
		else
		{
			tree[a].pR = &tree[R];
		}
	}
	tNode<int> *p = &tree[1];
	while(p)
	{
		cout << p->data << " ";
		p = p->pL;
	}
	return 0;
	
}

 目的是无论位置的编号是多少,把编号的地址取值然后放入指针,从而探寻指针的方式实现对结点编号的索引和取值的查找。

关键在于取值和编号并不需要相同,进行改进则引入id的方式。

该代码假设取值和编号相同

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值