入门题一:
输入一颗二叉树。你的任务是按从上到下、从左到右的顺序输出各个节点的值。每一个节点都依照从根节点到它的移动序列给出
(L表示左,R表示右)。在输入中,每一个节点的左括号和右括号之间没有空格,相邻节点之间用一个空格隔开。每颗树的输入用一
对空括号()结束(这对空括号不代表节点)
注意,假设从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出了超出一次,应到输出 -1 。节点个数不超过256。
例子输入:
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
(3,L) (4,R) ()
例子输出:
5 4 8 11 13 4 7 2 1
0
#include "stdio.h" #include "stdlib.h" #include "string.h" #define maxn 256 char buf[maxn]; //保存读入节点 int failed; int n=0,ans[maxn]; //节点个数和输出序列 typedef struct Tnode{ int have_value; //是有赋过值 int v; //节点值 struct Tnode *left,*right; }Node; Node *root; //二叉树的根节点 Node* newnode() { Node *tmp=(Node*)malloc(sizeof(Node)); if(tmp!=NULL) { tmp->have_value=0; //显示的初始化为0,由于malloc申请内存时并不把它清零 tmp->left=tmp->right=NULL; } return tmp; } void addnode(int value,char *s) { int length=strlen(s); Node *tmp=root; for(int i=0;i<length;i++){ //索引相应的位置 if('L'==s[i]) { if(NULL==tmp->left) tmp->left=newnode(); tmp=tmp->left; }else if('R'==s[i]){ if(NULL==tmp->right) tmp->right=newnode(); tmp=tmp->right; } } if(tmp->have_value) failed=1; //已经赋过值表明输入有误 tmp->v=value; tmp->have_value=1; } int read_input() { failed=0; root=newnode(); for(;;) { if(scanf("%s",buf)!=1) return 0; //整个输入结束 if(!strcmp(buf,"()")) break; int v; sscanf(&buf[1],"%d",&v); //读入节点的值 addnode(v,strchr(buf,',')+1); } return 1; } /* BFS,Breadth-Firsh Search 宽度优先遍历 */ int bfs() { int front=0,rear=1; Node* q[maxn]; q[0]=root; while(front<rear) { Node* tmp=q[front++]; if(tmp->have_value==0) return 0; ans[n++]=tmp->v; if(NULL != tmp->left) q[rear++]=tmp->left; if(NULL != tmp->right) q[rear++]=tmp->right; } return 1; } void remove_tree(Node* u) { if(NULL==u) return ; remove_tree(u->left); remove_tree(u->right); free(u); } int main() { read_input(); if(bfs() && !failed){ for(int i=0;i<n;i++){ printf("%d ",ans[i]); } }else{ printf("0 "); } return 0; }
入门题二:
输入一颗二叉树的先序遍历和中序遍历,输出它的后序遍历序列。
例子输入:
DBACEGF ABCDEFG
BCAD CBAD
例子输出:
ACBFGED
CDAB
#include "stdio.h" #include "string.h" #define maxn 20 char preorder[maxn],inorder[maxn],postOrder[maxn]; //先序、中序 和后序 //n树的节点个数,pre前序,in中序,post后序 void build(int n,char *pre,char *in,char *post) { if(n<=0) return; int x=strchr(in,pre[0])-in; //找到根节点在中序遍历中的位置 build(x,pre+1,in,post); //递归构造左子树的后序遍历 build(n-x-1,pre+x+1,in+x+1,post+x); //递归构造右子树的后序遍历 post[n-1]=pre[0]; //根节点加入到最后 } int main() { while(scanf("%s%s",preorder,inorder)==2) { int n=strlen(preorder); build(n,preorder,inorder,postOrder); postOrder[n]=' '; printf("%s ",postOrder); } return 0; }