タイトル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..ツリーを双方向チェーンテーブルに変換する場合.実は、
ノードの左サブツリーの最大ノードを探します
ノードの右指数の最小ノードを探します.
各ノードを再帰します.
元のポインタリンクを使用します.
はい、出力の各数の後にスペースが必要です.
テストデータのセットを指定します.
2 7 5 4 0 0 6 0 0 9 8 0 0 10 0 0 2 1 0 0 3 0 0
ツリーを入力し、ツリーを並べ替えた双方向チェーンテーブルに変換します.新しいノードを作成できない必要があります.ツリー内のノードポインタの方向を調整するしかありません.
入力:
入力には、複数のテストサンプルが含まれる場合があります.
各テストケースについて、入力された第1の動作の数n(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