1、n个结点有限集合,可以为空树,
2、结点的度数:结点子树的个数
3、树叶:没有子树的结点
4、分支结点:非终端结点
5、有序树:树的各节点的儿子都是有序的
6、层数:树根的层数为1
二叉树:
每个结点至多有两个子女
性质:
1、n个结点有n-1条边
2、深度为n的二叉树至多有个结点。
3、结点个数为n,深度为h,则
前面为向上取整
4、如果二叉树每个分支结点都有两个儿子,叶节点数为n,则分支结点的个数为n - 1
5、二叉树叶结点个数为n0,一个儿子的分支结点数为n1,有两个儿子的为n2,边的数量为e
则 n2 = n0 - 1; e = 2*n2 + n1; e = n0 + n1 + n2 -1
定义:
(1)满二叉树:深度为h且有个结点
(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的方式。
该代码假设取值和编号相同