主要是对二叉树的遍历,构造,还原
题目一:
二叉树的遍历
给定二叉树的前序遍历序列和中序遍历序列,求其后序遍历序列
struct Node{
Node *lchild;
Node *rchild;
char c;
}Tree[50]; //静态内存分配数组
利用分配数组元素给相应的节点实现内存分配,这是对内存分配较为简单的实现方法
int loc; //静态数组中已经分配的节点个数
Node *creat(){
Tree[loc].lchild = Tree[loc].rchild = NULL;
return &Tree[loc++]; //返回指针,且loc累加
}
void postOrder(Node *T) //后序遍历
{
if(T->lchild !=NULL)
{
postOrder(T->lchild);
}
if(T->rchild !=NULL)
{
postOrder(T->lchild);
}
printf("%c",T->c);
}
//核心-构造树
Node *build(int s1,int e1,int s2,int e2)
{
Node* ret = creat(); //为树根节点申请空间
ret->c = strl[s1];
int rootIdx;
//查找该根节点字符在中序遍历中的位置
for(int i=s2;i<=e2;i++)
{
if(str2[i]==str1[s1])
{
rootIdx = i;
break;
}
}
if(rootIdx!=s2)
{
ret->lchild = build(s1+1,s1+(rootIdx-s2),s2,rootIdx-1);
}
if(rootIdx !=e2)
{
ret->rchild = build(s1+(rootIdx-s2)+1,e1,rootIdx+1,e2);
}
return ret;
}
int main()
{
while(scanf("%s",str1)!=EOF)
{
scanf("%s",str2);
loc = 0;
int L1 = strlen(str1);
int L2 = strlen(str2);
Node *T = build(0,L1-1,0,L2-1);
postOrder(T); //后序遍历,输出节点信息
printf("\n");
}
return 0;
}
题目二: 完全二叉树 ????
特点:叶子结点只可能在层次最大的两层上出现;对任一结点,若其右分支下子孙的最大层次为l,则其左分支下子孙的最大层次必为l 或l+1
由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。
#include <stdio.h>
int main(void){
int m, n, cnt, num, left, right;
while (scanf ("%d%d", &m, &n) != EOF && m != 0 && n != 0){
cnt = num = 1;
left = 2 * m;
right = 2 * m + 1;
while (right <= n){
num *= 2;
cnt += num;
left *= 2;
right = 2 * right + 1;
}
if (left <= n)
cnt += (n-left+1);
printf ("%d\n", cnt);
}
return 0;
}