二叉树遍历(C语言)题目3例

本文介绍如何通过递归算法实现二叉树的构造与遍历,包括根据前序遍历序列创建二叉树并进行后序遍历输出,计算二叉树中叶子节点的数量,以及查找先序序列中指定位置的节点。
给定二叉树,设计程序构造和遍历二叉树:
 
前序遍历输入,后序遍历输出
 
例如二叉树:
 
 
输入序列ABD..EH...CF.I..G..
输出结果为:DHEBIFGCA
 
基本思想:
采用递归建立和遍历二叉树
 
建立:先建立根节点,然后建立左、右子树
遍历:左、右、根
 
源程序:
 
InBlock.gif#include<malloc.h> 
InBlock.gif#include <stdio.h> 
InBlock.gif 
InBlock.gifstruct node{ 
InBlock.gif  char info; 
InBlock.gif  struct node *llink, *rlink; 
InBlock.gif}; 
InBlock.gif 
InBlock.giftypedef struct node NODE; 
InBlock.gif 
InBlock.gifNODE *create(){ 
InBlock.gif  char x; 
InBlock.gif  NODE *p; 
InBlock.gif    scanf("%c", &x); 
InBlock.gif    printf("%c", x); 
InBlock.gif    if(x!='.'){ 
InBlock.gif      p=(NODE *)malloc(sizeof(NODE)); 
InBlock.gif      p->info=x; 
InBlock.gif      p->llink=create(); 
InBlock.gif      p->rlink=create(); 
InBlock.gif    } 
InBlock.gif    else 
InBlock.gif      p=NULL; 
InBlock.gif    return p; 
InBlock.gif
InBlock.gif 
InBlock.gif 
InBlock.gif void run(NODE *t){ 
InBlock.gif    
InBlock.gif  if(t){ 
InBlock.gif    run(t->llink); 
InBlock.gif    run(t->rlink); 
InBlock.gif 
InBlock.gif    printf("%c", t->info); 
InBlock.gif  } 
InBlock.gif
InBlock.gif 
InBlock.gif 
InBlock.gif 
InBlock.gifmain() 
InBlock.gif
InBlock.gif  NODE *T; 
InBlock.gif 
InBlock.gif  printf("Please input a tree:\n" ); 
InBlock.gif  T=create(); 
InBlock.gif  printf("\n"); 
InBlock.gif  if(!T) 
InBlock.gif    printf("This is a empty binary tree."); 
InBlock.gif  else 
InBlock.gif  {    
InBlock.gif    printf("The result of post travese is: \n"); 
InBlock.gif    run(T); 
InBlock.gif    
InBlock.gif  } 
InBlock.gif  printf("\n"); 
InBlock.gif}
编写递归算法,计算二叉树中叶子节点的数目:
 
源代码:
代码:
InBlock.gif#include<malloc.h> 
InBlock.gif#include <stdio.h> 
InBlock.gif 
InBlock.gifstruct node{ 
InBlock.gif  char info; 
InBlock.gif  struct node *llink, *rlink; 
InBlock.gif}; 
InBlock.gif 
InBlock.giftypedef struct node NODE; 
InBlock.gif 
InBlock.gifNODE *create(){ 
InBlock.gif  char x; 
InBlock.gif  NODE *p; 
InBlock.gif    scanf("%c", &x); 
InBlock.gif    printf("%c", x); 
InBlock.gif    if(x!='.'){ 
InBlock.gif      p=(NODE *)malloc(sizeof(NODE)); 
InBlock.gif      p->info=x; 
InBlock.gif      p->llink=create(); 
InBlock.gif      p->rlink=create(); 
InBlock.gif    } 
InBlock.gif    else 
InBlock.gif      p=NULL; 
InBlock.gif    return p; 
InBlock.gif
InBlock.gif 
InBlock.gifint run(NODE *t){ 
InBlock.gif  static int count=0;    
InBlock.gif  if(t){ 
InBlock.gif    run(t->llink); 
InBlock.gif    run(t->rlink); 
InBlock.gif 
InBlock.gif    
InBlock.gif    if(t->llink ==NULL && t->rlink == NULL) { 
InBlock.gif      count++;    
InBlock.gif    } 
InBlock.gif  } 
InBlock.gif  return count; 
InBlock.gif
InBlock.gif 
InBlock.gif 
InBlock.gif 
InBlock.gifmain() 
InBlock.gif
InBlock.gif  NODE *T; 
InBlock.gif  int left_number; 
InBlock.gif  printf("Please input a tree:\n" ); 
InBlock.gif  T=create(); 
InBlock.gif  printf("\n"); 
InBlock.gif  if(!T) 
InBlock.gif    printf("This is a empty binary tree."); 
InBlock.gif  else 
InBlock.gif  {    
InBlock.gif 
InBlock.gif    left_number=run(T); 
InBlock.gif    printf("There are %d leaves in this binary tree. \n", left_number);    
InBlock.gif  } 
InBlock.gif  printf("\n"); 
InBlock.gif}
编写递归算法,在二叉树中求位于先序序列中第K个位置的节点。
InBlock.gif#include<malloc.h> 
InBlock.gif#include <stdio.h> 
InBlock.gif 
InBlock.gifstruct node{ 
InBlock.gif  char info; 
InBlock.gif  struct node *llink, *rlink; 
InBlock.gif}; 
InBlock.gif 
InBlock.giftypedef struct node NODE; 
InBlock.gif 
InBlock.gifNODE *create(){ 
InBlock.gif  char x; 
InBlock.gif  NODE *p; 
InBlock.gif    scanf("%c", &x); 
InBlock.gif  //  printf("%c", x); 
InBlock.gif    if(x!='.'){ 
InBlock.gif      p=(NODE *)malloc(sizeof(NODE)); 
InBlock.gif      p->info=x; 
InBlock.gif      p->llink=create(); 
InBlock.gif      p->rlink=create(); 
InBlock.gif    } 
InBlock.gif    else 
InBlock.gif      p=NULL; 
InBlock.gif    return p; 
InBlock.gif
InBlock.gif 
InBlock.gifrun(NODE *t, int k){ 
InBlock.gif  static int i=0; 
InBlock.gif  if(t&&i!=k) 
InBlock.gif  { 
InBlock.gif    i++; 
InBlock.gif    if(i==k) printf("%c",t->info); 
InBlock.gif    else 
InBlock.gif      { 
InBlock.gif        run(t->llink,k); 
InBlock.gif        run(t->rlink,k); 
InBlock.gif      } 
InBlock.gif  } 
InBlock.gif
InBlock.gif 
InBlock.gif 
InBlock.gifmain() 
InBlock.gif
InBlock.gif  NODE *T; 
InBlock.gif  int k; 
InBlock.gif  printf("Please input a tree:\n" ); 
InBlock.gif  T=create(); 
InBlock.gif  printf("\n"); 
InBlock.gif  printf("input k:\n"); 
InBlock.gif    scanf("%d", &k); 
InBlock.gif  if(!T) 
InBlock.gif    printf("This is a empty binary tree."); 
InBlock.gif  else 
InBlock.gif  {    
InBlock.gif 
InBlock.gif    run(T,k); 
InBlock.gif  } 
InBlock.gif  printf("\n"); 
InBlock.gif}




本文转自 fsjoy1983 51CTO博客,原文链接:http://blog.51cto.com/fsjoy/113510,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值