タイトル1503:二叉検索ツリーと双方向チェーンテーブル-九度

2289 ワード

タイトルの説明:
ツリーを入力し、ツリーを並べ替えた双方向チェーンテーブルに変換します.新しいノードを作成できない必要があります.ツリー内のノードポインタの方向を調整するしかありません.
入力:
入力には、複数のテストサンプルが含まれる場合があります.
各テストケースについて、入力された第1の動作の数n(0次のn行は、行ごとに2叉探索ツリーのシーケンスが遍歴され、左右のサブツリーが空であれば0で置き換えられる.
出力:
各テストケースに対応し、
二叉探索ツリーを並べ替えた双方向チェーンテーブルに変換した後,チェーンテーブルヘッダからチェーンテーブルテールまでの遍歴結果を出力する.
サンプル入力:
1
2 1 0 0 3 0 0
サンプル出力:
1 2 3
推奨指数:※※
ソース:http://ac.jobdu.com/problem.php?pid=1503
アルゴリズムを練習します.
1.再帰入力
2..ツリーを双方向チェーンテーブルに変換する場合.実は、
ノードの左サブツリーの最大ノードを探します
ノードの右指数の最小ノードを探します. 
各ノードを再帰します.
元のポインタリンクを使用します.
はい、出力の各数の後にスペースが必要です.
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
typedef struct node{
    int val;
    node *left;
    node *right;
}node;
node * input_tree(){
	int tmp;
	scanf("%d",&tmp);
	if(0==tmp){
		return NULL;
	}
	node *new_node=new node;
	new_node->val=tmp;
	new_node->left=input_tree();
	new_node->right=input_tree();
	return new_node;
}

void tree_to_link(node *root){
	if(root!=NULL){
        node *p=root->left;
        while(p!=NULL&&p->right!=NULL){// find it pre
            p=p->right;
        }
        node *q=root->right;
        while(q!=NULL&&q->left!=NULL){// find it next
            q=q->left;
        }
        tree_to_link(root->left);//handle left
        tree_to_link(root->right);//handle right
        if(p!=NULL){//link
            p->right=root;
            root->left=p;
        }
        if(q!=NULL){//link
            q->left=root;
            root->right=q;
        }
	} 
}
int main()
{
	int n;
	scanf("%d",&n);
	while(n--){
		node *t=new node;
		scanf("%d",&t->val);
		
		t->left=input_tree();    
		t->right=input_tree();    
		node *lhead=t;
		while(lhead!=NULL&&lhead->left!=NULL){
            lhead=lhead->left;
		}
		tree_to_link(t);
		while(lhead!=NULL){
            printf("%d ",lhead->val);
            lhead=lhead->right;
		}
		printf("
"); } return 0; }

テストデータのセットを指定します.
2 7 5 4 0 0 6 0 0 9 8 0 0 10 0 0 2 1 0 0 3 0 0