超基礎!樹的先中後序遍歷

個人筆記(直接貼代碼)
#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;
} 

發佈了28 篇原創文章 · 獲贊 23 · 訪問量 5259
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章