| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1743 人关注过本帖
标题:二叉树的先序遍历与后序遍历
只看楼主 加入收藏
强者
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-10-9
收藏
 问题点数:0 回复次数:9 
二叉树的先序遍历与后序遍历
1.建立如下图所示的二叉树
                           A
                  B                    C
              D                     E      F
                  G
  
2.编写程序对上述二叉树进行先序遍历和后序遍历。
3. 编写函数按先序遍历方式统计二叉树中的叶子结点数并显示在屏幕上。
搜索更多相关主题的帖子: 遍历 二叉树 
2008-11-17 16:45
wntqqqddd
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-9-15
收藏
得分:0 
我会
2008-11-17 23:16
dxq530610286
Rank: 2
等 级:论坛游民
帖 子:54
专家分:10
注 册:2007-10-1
收藏
得分:0 
光说会  把代码拿出来  让大家一起一起学习学习啊
2008-11-18 21:59
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
遍历的问题不用多说了,统计叶子结点你可以用递归,
叶子结点数=左子树叶子结点数+右子树叶子结点数,如果自己就是
叶子结点返回1,代码不难写,自己写吧.
2008-11-18 22:07
强者
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-10-9
收藏
得分:0 
#include"stdlib.h"
 #include"stdio.h"

  typedef char DataType;

  typedef struct Node
  {DataType data;
  struct Node *leftchild;
  struct Node *rightchild;
   }BiTreeNode;

  void Visit(DataType item)
  {printf("%c",item);
  }


 void  Destroy(BiTreeNode **root)
 { if((*root)!=NULL&&((*root)->leftchild!=NULL))
     Destroy(&(*root)->leftchild);
     if((*root)!=NULL&&((*root)->rightchild!=NULL))
     Destroy(&(*root)->rightchild);
     free(*root);
     }


  void Initiate(BiTreeNode **root)
  {*root=(BiTreeNode  *)malloc(sizeof(BiTreeNode));
  (*root)->leftchild=NULL;
  (*root)->rightchild=NULL;
  }

 BiTreeNode *InsertLeftNode(BiTreeNode *curr,DataType x)
  {BiTreeNode *s,*t;
  if(curr==NULL)  return NULL;
   t=curr->leftchild;
   s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
   s->data=x;
     s->leftchild=t;
   s->rightchild=NULL;

   curr->leftchild=s;
   return curr->leftchild;
   }

 BiTreeNode *InsertRightNode(BiTreeNode *curr,DataType x)
  {  BiTreeNode *s,*t;
    if(curr==NULL)  return NULL;
     t=curr->rightchild;
   s=(BiTreeNode *)malloc(sizeof(BiTreeNode));
   s->data=x;
   s->rightchild=t;
      s->leftchild=NULL;
   curr->rightchild=s;
   return curr->rightchild;
   }


   BiTreeNode *DeleteLeftTree(BiTreeNode *curr)
   {if(curr==NULL||curr->leftchild==NULL)
     return NULL;
     Destroy(&curr->leftchild);
     curr->leftchild=NULL;
     return curr;
     }


     BiTreeNode *DeleteRightTree(BiTreeNode *curr)
   {if(curr==NULL||curr->rightchild==NULL)
     return NULL;
     Destroy(&curr->rightchild);
     curr->rightchild=NULL;
     return curr->rightchild;
     }
   


     void PrintBiTree(BiTreeNode *bt,int n)
     {int i;
     if(bt==NULL)return;
     PrintBiTree(bt->rightchild,n+1);
     for(i=0;i<n;i++)printf("  ");
     if(n>=0)
     {printf("------");
     printf("%c\n",bt->data);
     }
    
     PrintBiTree(bt->leftchild,n+1);
    
     }


     void PreOrder(BiTreeNode *t,void Visit(DataType item))
     {if(t!=NULL)
     {Visit(t->data);
     PreOrder(t->leftchild,Visit);
     PreOrder(t->rightchild,Visit);
     }
     }

     void PostOrder(BiTreeNode *t,void Visit(DataType item))
     {if(t!=NULL)
     { PostOrder(t->leftchild,Visit);
     PostOrder(t->rightchild,Visit);
     Visit(t->data);
     }
     }

    int leafsum(BiTreeNode *s)/*统计叶子结点数并打印叶子节点*/
    { int n;
        if(s==NULL) return 0;
    if(s->leftchild==NULL&&s->rightchild==NULL)

    {Visit(s->data);
        leafsum(s->leftchild);
    leafsum(s->rightchild);
    printf("\n");
    return 1;}

    n=(leafsum(s->leftchild)+leafsum(s->rightchild));
    return n;
    
    }

     void  main(void)
     {int t;
         BiTreeNode *root,*p,*pp;
     Initiate(&root);
     p=InsertLeftNode(root,'A');
      p=InsertLeftNode(p,'B');
      p=InsertLeftNode(p,'D');
      p=InsertRightNode(p,'G');
       p=InsertRightNode(root->leftchild,'C');
     pp=p;
     InsertLeftNode(p,'E');
     InsertRightNode(pp,'F');
   

     PrintBiTree(root,0);
       printf("前序遍历:");
     PreOrder(root->leftchild,Visit);
     printf("\n后序遍历:");
      PostOrder(root->leftchild,Visit);
      printf("\n");
     t=leafsum(root->leftchild);/*这个是求得叶子结点*/
     printf("%d",t);
    
     Destroy(&root);

     }
    欢迎参考哦!!这是我自己做的,是可以实现的!大家学习一下吧
2008-11-20 23:39
强者
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-10-9
收藏
得分:0 
刚刚开始的那些都是一些函数来的,关于二叉树要用到的操作函数,以及撤消,还有遍历的函数~不动可以提出来哦!!
2008-11-20 23:40
秀南
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2008-11-22
收藏
得分:0 
为什么不用递归做呢?
那不是更简单吗
2008-11-22 16:15
强者
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2008-10-9
收藏
得分:0 
那你用递归写写看 啊,我想知道啊~~
2008-11-26 21:28
hslglzs2008
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-11-9
收藏
得分:0 
用的着这么麻烦吗?天都亮 了
2008-11-28 17:48
wefgod
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-11-27
收藏
得分:0 
void PreOrder(Tree btree)
{
    if(btree==null)
        return;
    else
    {
        printf(" %c",btree->data);
        PreOrder(btree->lchild);
        PreOrder(btree->rchild);
    }
}

void MidOrder(Tree btree)
{
    if(btree==null)
        return;
    else
    {
        MidOrder(btree->lchild);
        printf(" %c",btree->data);
        MidOrder(btree->rchild);
    }
}

void PostOrder(Tree btree)
{
    if(btree==null)
        return;
    else
    {
        PostOrder(btree->lchild);
        PostOrder(btree->rchild);
        printf(" %c",btree->data);
    }
}

............这样的递归谁写不出来.........
LZ的ID可是强者``
2008-11-29 10:37
快速回复:二叉树的先序遍历与后序遍历
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036780 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved