#include <cstdio>
#include <iostream>
#define maxn 110
using namespace std;
int f[maxn],l[maxn],r[maxn];
int v[maxn];
int n,t;
void init() { //建樹
int p, k, lch, rch; //結點編號,權值,左右孩子指針
scanf( "%d", &n );
for( int i = 1; i <= n; i++ ) {
scanf( "%d%d%d%d", &p, &k, &lch, &rch );
v[p] = k;
l[p] = lch;
r[p] = rch;
if( lch ) f[lch] = p;
if( rch ) f[rch] = p;
}
}
int root() { //找根結點
for( int i = 1; i <= n; i++ ) {
if( f[i] == 0 )
return i;
}
}
void preorder( int i ) { //先序遍歷
if( i ) {
printf( "%d ", v[i] );
preorder( l[i] );
preorder( r[i] );
}
}
void inorder( int i ) { //中序遍歷
if( i ) {
inorder( l[i] );
printf( "%d ",v[i] );
inorder( r[i] );
}
}
void sucorder( int i ){ //後序遍歷
if( i ) {
sucorder( l[i] );
sucorder( r[i] );
printf( "%d ", v[i] );
}
}
void leaf( int i ) { //輸出葉結點
if( i ) {
if( l[i] + r[i] == 0 ) printf( "%d ", i );
leaf( l[i] );
leaf( r[i] );
}
}
int h( int i ) { //計算樹的高度
if( i == 0 ) return 0;
return max( h( l[i] ), h( r[i] ) ) + 1;
}
void leaf( int i ) { //輸出葉結點
if( i ) {
if( l[i] + r[i] == 0 ) printf( "%d ", i );
leaf( l[i] );
leaf( r[i] );
}
}
int h( int i ) { //計算樹的高度
if( i == 0 ) return 0;
return max( h( l[i] ), h( r[i] ) ) + 1;
}
int main() {
freopen( "tree.in","r",stdin );
init();
t=root(); printf( "%d\n", t );
preorder( t ); printf( "\n" );
inorder( t ); printf( "\n" );
sucorder( t ); printf( "\n" );
leaf( t ); printf( "\n" );
printf( "%d\n", h( t ) );
return 0;
}
超基礎!樹的先中後序遍歷
個人筆記(直接貼代碼)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.