标签:
Description
Input
Output
N = 9
数据:1 7 5 21 22 27 25 20 10
根据odd session的规则,所以10就是根节点。(1 7 5)是左子树:比10小
(21 22 27 25 20)是右子树:比10大
然后对于(1 7 5)再次建树,5是根节点,1是左子树,5是右子树
对所有的左右子树进行递归操作,即可建立一颗二叉树。
2)已经建好树了,对树按照even sessions(右分支,左分支,根)进行递归输出,即可。
代码如下:
#include <stdio.h>
#define MAX_NUMBER 3000
typedef struct nodeType
{
int value;
int left;
int right;
}nodeType;
nodeType node[MAX_NUMBER];
int N;
int input[MAX_NUMBER];
int count = 0;
int buildTree(int begin, int end);
int printEven(int number);
int main()
{
//freopen("input.txt","r",stdin);
int i = 0;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf(" %d",&input[i]);
}
buildTree(0,N-1);
printEven(0);
return 0;
}
int buildTree(int begin, int end)
{
int i = 0;
if(begin>end) //如果只有右子树,不存在左子树,则会进入该条件。
return -1;
int pos = count;
count++;
node[pos].value = input[end];
if(begin==end)
{
node[pos].left = -1;
node[pos].right = -1;
return pos;
}
for(i=begin;i<end;i++)
{
if(input[i]>input[end])
{
break;
}
}
int l = buildTree(begin,i-1); //如果只有右子树,不存在左子树, begin 和 i相等,所以进入buildTree(),begin>end
int r = buildTree(i,end-1);
node[pos].left = l;
node[pos].right = r;
return pos;
}
int printEven(int number)
{
if(number == -1)
return 0;
printEven(node[number].right);
printEven(node[number].left);
if(number==0)
printf("%d\n",node[number].value);
else
printf("%d ",node[number].value);
return 0;
}
标签:
原文地址:http://www.cnblogs.com/xuxu-ning/p/5015520.html