【データ構造】二叉樹を振り返る
1.なぜ木があるのですか?大量の入力データがあると、チェーンの線形アクセス時間が長くなりますから.一方、ツリー構造のほとんどの動作の動作時間は平均的にO(logN)である.
2.木の実現は難しくないです.何行かのコードでできます.
みなさんのご注目やコレクション、コメント、コメント、コメントをお待ちしております.
本文に斧と質問を得るために、転載は出典を明記してください.http://blog.csdn.net/nomasp
2.木の実現は難しくないです.何行かのコードでできます.
struct TreeNode
{
Object element;
TreeNode *firstChild;
TreeNode *nextSibling;
}
3.巡回形式://
void inorder(tree_pointer ptr)
{
if(ptr)
{
inorder(ptr->left_child);
printf("%d",ptr->data);
inorder(ptr->right_child);
}
}
//
void preorder(tree_pointer ptr)
{
if(ptr)
{
printf("%d",ptr->data);
preorder(ptr->left_child);
preorder(ptr->right_child);
}
}
//
void postorder(tree_pointer ptr)
{
if(ptr)
{
postorder(ptr->left_child);
postorder(ptr->right_child);
printf("%d",ptr->data);
}
}
4.反復の中順序巡回void iter_inorder(tree_pointer node)
{
int top=-1;
tree_pointer stack[MAX_STACK_SIZE];
for(;;)
{
for(;node;node=node->left_child)
add(&top,node);
node=delete(&top);
if(!node)
break;
printf("%d",node->data);
node=node->right_child;
}
}
5.二叉樹の順を巡るvoid level_order(tree_pointer ptr)
{
int front=rear=0;
tree_pointer queue[MAX_QUEUE_SIZE];
if(!ptr)
return;
addq(front,&rear,ptr);
for(;;)
{
ptr=deleteq(&front,rear);
if(ptr)
{
printf("%d",ptr->data);
if(ptr->left_child)
addq(front,&rear,ptr->left_child);
if(ptr->right_child)
addq(front,&rear,ptr->right_child);
}
else
break;
}
}
6.二叉樹の複製tree_pointer copy(tree_pointer original)
{
tree_pointer temp;
if(original)
{
temp=(tree_pointer) malloc(sizeof(node));
if(IS_FULL(temp))
{
fprintf(stderr,"The memory is full
");
exit(1);
}
temp->left_child=copy(original->left_child);
tmep->right_child=copy(original->right_child);
temp->data=original->data;
return temp;
}
return NULL;
}
7.二叉樹の等価性を判断するint equal(tree_pointer first,tree_pointer second)
{
return ((!first&&!second)||(first && second && (first->data == second->data) &&
equal(first->left_child,second->left_child) &&
equal(first->right_child,second->right_child));
}
8.結点を探していますが、中次ぎが続きます.threaded_pointer insucc(threaded_pointer tree)
{
threaded_pointer temp;
temp=tree->right_child;
if(!tree->right_thread)
while(!temp->left_thread)
temp=temp->left_child;
return temp;
}
9.手がかり二叉の木の中順を巡るvoid tinorder(threaded_pointer tree)
{
threaded_pointer temp=tree;
for(;;)
{
temp=insucc(temp);
if(temp==tree)
break;
printf("%3c",temp->data);
}
}
10.スレッド二叉樹の右挿入操作void insert_right(threaded_pointer parent,threaded_pointer child)
{
threaded_pointer temp;
child->right_child=parent->right_child;
child->right_thread=parent->right_thread;
child->left_child=parent;
child->left_thread=TRUE;
parent->right_child=child;
parent->right_thread=FALSE;
if(!child->right_thread)
{
temp=insucc(child);
temp->left_child=child;
}
}
ご訪問ありがとうございます.ご協力をお願いします.みなさんのご注目やコレクション、コメント、コメント、コメントをお待ちしております.
本文に斧と質問を得るために、転載は出典を明記してください.http://blog.csdn.net/nomasp