图的开始--第四天打卡之特殊的图——树(二叉树)
作者:
lgd123
,
2021-07-28 17:05:31
,
所有人可见
,
阅读 231
/*二叉树
1、如果一颗树所有的子节点数不超过2,则这一类的树被称为二叉树。
2、在二叉树中每个节点都会有俩子节点,分别是左子节点,和右子节点
3、在二叉树中要严格区分子节点是左子节点还是右子节点,在只有一个子节点的情况下。
4、有特定顺序的树被称为有序树。
5、满二叉树:每一个分支节点都包括左子树和右子树,且叶子都在同一层上。
公式表达为:设深度为k,则节点有2的k次方-1个的树,被称为满二叉树
6、完全二叉树:若将二叉树从上至下,从左到右依次标记并且标记的顺序与满二叉树一致
注:对于完全二叉树,它对于一个分支节点没有要求必须是俩子节点,所以,满二叉树一定是完全二叉树,反之则不然。
7、满二叉树的特点:
①、所有的树中它的叶节点和分治节点最多
②、它的每一个分支节点的度都是2
8、完全二叉树的特点:
①、叶子结点出现在最下层和次下层。
②、如果该节点的度为1,则该节点只有左子树。
*/
//关于树高的求法:先算出左子节点的高+1和右子节点的高+1,取最大值即可。
[更多补充](https://blog.csdn.net/u012060033/article/details/107128291/)
----------
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 10010;
struct node
{
int p,l,r;
}T[N];
int n,d[N],h[N];
//记录深度
void setDepth(int u,int p)
{
if(u==-1) return ;
d[u]=p;
setDepth(T[u].l,p+1);
setDepth(T[u].r,p+1);
}
//记录高度,每个节点的
int setHeight(int u)
{
int h1 = 0,h2 = 0;
if(T[u].l!=-1) h1 = setHeight(T[u].l)+1;
if(T[u].r!=-1) h2 = setHeight(T[u].r)+1;
return h[u]=max(h1,h2);
}
//判断兄弟节点
int getsibling(int u)
{
if(T[u].p==-1) return -1;
if(T[T[u].p].l!=-1&&T[T[u].p].l!=u) return T[T[u].p].l;
//这里如果存在左子节点且该点u不是这个左子节点,则这个左子节点是u的兄弟节点
if(T[T[u].p].r!=-1&&T[T[u].p].r!=u) return T[T[u].p].r;
return -1;
}
void print(int u)
{
cout<<"node "<<u<<": ";
cout<<"parent = "<<T[u].p<<", ";
cout<<"sibling = "<<getsibling(u)<<", ";
int deg = 0;
if(T[u].l!=-1) deg++;
if(T[u].r!=-1) deg++;
cout<<"degree = "<<deg<<", ";
cout<<"depth = "<<d[u]<<", ";
cout<<"height = "<<h[u]<<", ";
if(T[u].p==-1) cout<<"root"<<endl;
else if(T[u].l==-1&&T[u].r==-1) cout<<"leaf"<<endl;
else cout<<"internal node"<<endl;
}
int main()
{
int v,l,r,root = 0;
cin>>n;
memset(T,-1,sizeof(T));
for(int i=0;i<n;i++)
{
cin>>v>>l>>r;
T[v].l = l;
T[v].r = r;
if(l!=-1) T[l].p = v;
if(r!=-1) T[r].p = v;
}
for(int i = 0 ;i < n;i ++)
{
if(T[i].p==-1) root = i;
}
setDepth(root,0);
setHeight(root);
for(int i = 0;i < n;i ++)
{
print(i);
}
return 0;
}
很棒,我也是新手2333
一起加油!!