二叉树的表达,题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_7_B
思路:建立一个二叉树,每个节点如下:
struct node {
int parent,left,right;
};
parent存父节点,left和right分别存左孩子和右孩子。
初始化全部属性都赋为NIL(-1)
求深度的方法有两种,同 https://blog.csdn.net/qq_33982232/article/details/80454501
求高度的方法,也有两种,第一种是建立一个高度数组,存放每个节点的高度,递归填充数组。
我采用的是另一种方法,对每一个节点求高度的时候都递归求解。
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxx = 28;
const int NIL = -1;
struct node {
int parent,left,right;
};
node tree[maxx];
int get_depth(int x){
int depth=0;
while(tree[x].parent!=NIL){
x=tree[x].parent;
depth++;
}
return depth;
}
int get_height(int x){
int h1=0,h2=0;
if((tree[x].left==NIL)&&(tree[x].right==NIL)) return 0;
if(tree[x].left!=NIL) h1=get_height(tree[x].left)+1;
if(tree[x].right!=NIL) h2=get_height(tree[x].right)+1;
return max(h1,h2);
}
int main (){
for(int i = 0;i<maxx;i++) {
tree[i].parent=NIL;
tree[i].left=NIL;
tree[i].right=NIL;
}
int n;
cin>>n;
int a,b,c;
for(int i=0;i<n;i++){
cin>>a>>b>>c;
tree[a].left=b;
tree[a].right=c;
if(b!=NIL) tree[b].parent=a;
if(c!=NIL) tree[c].parent=a;
}
for(int i=0;i<n;i++){
printf("node %d: parent = %d",i,tree[i].parent);
if(tree[i].parent==NIL) printf(", sibling = -1");
else if(tree[tree[i].parent].left==i) printf(", sibling = %d",tree[tree[i].parent].right);
else printf(", sibling = %d",tree[tree[i].parent].left);
if(tree[i].left!=NIL){
if(tree[i].right!=NIL) printf(", degree = 2"); else printf(", degree = 1");
}
else{
if(tree[i].right!=NIL) printf(", degree = 1"); else printf(", degree = 0");
}
printf(", depth = %d",get_depth(i));
printf(", height = %d",get_height(i));
if(tree[i].parent==NIL) printf(", root");
else if(tree[i].left==NIL&&tree[i].right==NIL) printf(", leaf");
else printf(", internal node");
printf("\n");
}
return 0;
}
错点:
1.读入过程中,如下代码, 注意,所有的节点输入值和i无关,节点的序号由输入值a决定,这个错误同ALDS1_7_A中的错误
for(int i=0;i<n;i++){
cin>>a>>b>>c;
tree[a].left=b;
tree[a].right=c;
if(b!=NIL) tree[b].parent=a;
if(c!=NIL) tree[c].parent=a;
}
2.读入过程中,要加两个if的判断,否则会出现对tree[-1]的访问,造成越界。
if(b!=NIL) tree[b].parent=a;
if(c!=NIL) tree[c].parent=a;
3.求高度的过程中要加这一句话,否则会死循环。(这个不用写...)
if((tree[x].left==NIL)&&(tree[x].right==NIL)) return 0;