網(wǎng)站評估怎么做北京百度推廣電話
有一個(gè)結(jié)點(diǎn)的二叉樹。給出每個(gè)結(jié)點(diǎn)的兩個(gè)子結(jié)點(diǎn)編號,建立一棵二叉樹,如果是葉子結(jié)點(diǎn),則輸入 0 0
。
建好樹這棵二叉樹之后,依次求出它的前序、中序、后序列遍歷。
輸入格式:
第一行一個(gè)整數(shù)n ,表示結(jié)點(diǎn)數(shù)。
之后n 行,每行兩個(gè)整數(shù) 、分別表示結(jié)點(diǎn) 的左右子結(jié)點(diǎn)編號。若為0則表示無子結(jié)點(diǎn)
輸出格式:
輸出三行,每行n個(gè)數(shù)字,用空格隔開。
第一行是這個(gè)二叉樹的前序遍歷。
第二行是這個(gè)二叉樹的中序遍歷。
第三行是這個(gè)二叉樹的后序遍歷。
輸入樣例:
在這里給出一組輸入。例如:
7
2 7
4 0
0 0
0 3
0 0
0 5
6 0
輸出樣例:
在這里給出相應(yīng)的輸出。例如:
1 2 4 3 7 6 5
4 3 2 1 6 5 7
3 4 2 5 6 7 1
?代碼:
#include <stdio.h>
struct node
{int data;int lchild,rchild;
};
int time=0; //第一次不輸出空格
void preorder(struct node tree[],int data)
{if (data==0)return;if (time)printf(" ");printf("%d",data);preorder(tree,tree[data].lchild);preorder(tree,tree[data].rchild);
}void inorder(struct node tree[],int data)
{if (data==0)return;inorder(tree,tree[data].lchild);if (time)printf(" ");printf("%d",data);time++;inorder(tree,tree[data].rchild);
}void postorder(struct node tree[],int data)
{if (data==0)return;postorder(tree,tree[data].lchild);postorder(tree,tree[data].rchild);if (time)printf(" ");printf("%d",data);time++;
}
int main()
{int n;scanf("%d",&n);struct node tree[n+1];int flag[n+1],root;for (int i =0;i<n+1;i++)flag[i] = 0;for (int i=1;i<n+1;i++){tree[i].data = i;scanf("%d%d",&tree[i].lchild,&tree[i].rchild);flag[tree[i].lchild]=1;flag[tree[i].rchild]=1;}for (int i=1;i<n+1;i++)//根節(jié)點(diǎn)沒有輸入過if(!flag[i])root = i;preorder(tree,root);printf("\n");time = 0;inorder(tree,root);printf("\n");time = 0;postorder(tree,root);
}