求C语言版数据结构二叉树的先序遍历递归算法,不要伪码,要求能实现能运行的。谢过各位大佬了!

如题所述

K&R中的一个实现,可以读取数字,插入二叉树,并且统计出现次数。最后输出,这里假设只读取正数,自己可以改getword函数

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
 
#define MAXLINE 100
 
struct num {
    int number;
    int count;
    struct num *left;
    struct num *right;
} ;
 
struct num *addtree(struct num *, char w[]);
void treeprint(struct num *);
int getword(char w[], int lim);
 
int main(void)
{
    struct num *root;
    char word[MAXLINE];
 
    root = NULL;
    while (getword(word, MAXLINE) != EOF)
        if (isdigit(word[0]))
            root = addtree(root, word);
    treeprint(root);
 
    return 0;
}
 
int getword(char *word, int lim)
{
    int c;
    int getch();
    void ungetch();
    char *w = word;
 
    while (isspace(c = getch()))
        ;
    if (c != EOF)
        *w++ = c;
    if (!isdigit(c)) {
        *w = '\0';
        return c;
    }
    for (; --lim > 0; w++) {
        if (!isdigit(c = *w = getch())) {
            ungetch(c);
            break;
        }
    }
    *w = '\0';
    return word[0];
}
 
struct num *talloc(void);
struct num *addtree(struct num *p, char *w)
{
    int cond;
 
    cond = atoi(w);
   // printf("---%d---\n", cond);
    if (p == NULL) {
        p = talloc();
        p->number = cond;
        p->count = 1;
        p->left = p->right = NULL;
    } else if (cond == p->number) 
        p->count++;
    else if (cond < p->number)
        p->left = addtree(p->left, w);
    else
        p->right = addtree(p->right, w);
    return p;
}
 
void treeprint(struct num *p)
{
    if (p != NULL) {
        treeprint(p->left);
        printf("%d\thas:%d\n", p->number, p->count);
        treeprint(p->right);
    }
}
 
struct num *talloc(void)
{
    return (struct num *) malloc(sizeof(struct num));
}
 
#define BUFSIZE 100
int bufp = 0;
char bufline[BUFSIZE];
int getch(void)
{
    return (bufp > 0) ? bufline[--bufp] : getchar();
}
void ungetch(int c)
{
    if (bufp < BUFSIZE)
        bufline[bufp++] = c;
    else
        printf("error : full\n");
}


温馨提示:内容为网友见解,仅供参考
无其他回答

关于数据结构二叉树先序遍历递归的问题
}BitNode,*BitTree;\/\/按先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树 \/\/构造二叉树表表示的二叉树T void CreateBitTree(BitTree &T){ char ch;scanf("%c",&ch);if(ch==' ') T=NULL;else { T=(BitNode *)malloc(sizeof(BitNode));T->data=ch;\/\/生成根结点 Cre...

请大神用C语言帮编一个关于家谱的程序!要求:
Status CreateBitree(BiTree &T);\/\/按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树。\/\/构造二叉链表表示的二叉树T.void PreOrder(BiTree T);\/\/采用二叉链表存储结构,先序遍历二叉树T,对每个结点的访问就是输出它的值 void Inorder(BiTree T);\/\/采用二叉链表存储结构,中序...

已知二叉树的先序遍历序列是AEFBGCDHIKJ,中序遍历序列是EFAGBCHKIJD...
二叉树把J换到I的右子树就好,后序遍历:FEGKJIHDCBA 线索二叉树就是在二叉树上用线把各节点的前驱和后继画出来,要用有向线,所以图中大部分节点的连线都是双向的,除了首节点F。include<stdio.h> include<stdlib.h> include<string.h> typedef struct BiTNode{ char e;struct BiTNode *lchild,...

二叉树先知道后序和中序,求先序
然后去掉DE,考虑下面E的右子树;后序AB 中序BA易知:B为根结点,A为其右结点;所以整个树为:C(E(D,B(,A)));先序:CEDBA。

...中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历是什么...
由前序遍历,C是二叉树的右根节点,由中序遍历,C不含左子节点,HF为C的右子节点。由前序遍历,F为H的根节点,由中序遍历,H为F的左子节点。在二叉树中,求后序遍历,先左后右再根,即首先遍历左子树,然后遍历右子树,最后访问根结点。则该二叉树的后序遍历是DGEBHFCA。

二叉树的先根遍历,中根遍历和后根遍历
所以,我们发现,二叉树的定义其实是一个递归定义的过程 大的二叉树是由小的二叉树构建而成的 所以,当我们考虑要遍历一棵二叉树时 也是首选递归的遍历 遍历二叉树 它的基本思想是先按照上面的形式把整棵二叉树划分为3部分 哪么接下来的工作就很简单了 我们只需要将这3部分都遍历一遍就可以了(这里...

二叉树的遍历非递归算法中应注意哪些问题
先序非递归算法 【思路】假设:T是要遍历树的根指针,若T != NULL 对于非递归算法,引入栈模拟递归工作栈,初始时栈为空。问题:如何用栈来保存信息,使得在先序遍历过左子树后,能利用栈顶信息获取T的右子树的根指针?方法1:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶...

数据结构算法设计——统计二叉树叶子结点的个数,并输出结果
{ if(A==NULL)return 0;else if(A->lchild==NULL&&A->rchild==NULL)return 1;else return NodeTree(A->lchild)+NodeTree(A->rchild);} int main(){ BiTree A;int b;printf("先序法赋值(空用#表示):");CreatTree(A);b=NodeTree(A);printf("共有%d个叶子节点\\n",b);} ...

二叉树遍历演示
余下的三种顺序TLR、LTR和LRT根据根访问的位置不同分别被称为先序遍历、中序遍历和后序遍历。(1)先序遍历若二叉树为空,则结束遍历操作;否则访问根结点;先序遍历左子树;先序遍历右子树。(2)中序遍历若二叉树为空,则结束遍历操作;否则中序遍历左子树;访问根结点;中序遍历右子树。(3)后...

pascal给出一棵二叉树的中序与后序排列。求出它的先序排列(帮忙解释一...
首先知道:先序:根左右;后序,左右根;中序,左根右。看过程:是递归调用的:if length(s2)=1 then write(s2){如果当前后序遍历只有一个就直接输出该位置} else begin k:=pos(s2[length(s2)],s1);{后序排序的最后一个是当前序列的根,寻找根在中序排序中的位置,则中序排序被跟分成...

相似回答