C语言二叉树递归算法怎么做?

Python016

C语言二叉树递归算法怎么做?,第1张

#include <stdio.h>

#include <string.h>

struct treenode{

    int value

    treenode* left

    treenode* right

}

typedef treenode* BiTree

void visit(treenode* node)

{

    printf("%2d ", node->value)

}

//    结点总数 

int node(BiTree T)

{

    if( !T ){

        return 0

    }

    return node(T->left) + node(T->right) + 1

}

//    前序 

void preOrder(BiTree T)

{

    if( T ){

        visit(T)

        preOrder(T->left)

        preOrder(T->right)    

    }

}

//    中序

void inOrder(BiTree T)

{

    if( T ){

        inOrder(T->left)

        visit(T)

        inOrder(T->right)    

    }    

//    后序

void postOrder(BiTree T)

{

    if( T ){

        postOrder(T->left)

        postOrder(T->right)    

        visit(T)

    }    

//    叶子节点数

int leafnode(BiTree T)

{

    if( T ){

        if( !T->left && !T->right )

            return 1

        else

            leafnode(T->left) + leafnode(T->right)    

    }else{

        return 0

    }

int height(BiTree T)

{

    if( T ){

        int lh = height(T->left)

        int rh = height(T->right)

        return (lh>rh ? lh:rh) + 1

    }else{

        return 0

    }

}

int main()

{

    

    return 0

}

#include "stdio.h"

#include "stdlib.h"

#define STACK_INIT_SIZE 10 //栈的初始长度

#define STACKINCREMENT 5 //栈的追加长度

typedef struct bitree{

char data

struct bitree *lchild,*rchild

}bitree //二叉树结点定义

typedef struct {

bitree **base

bitree **top

int stacksize

}sqstack // 链栈结点定义top栈顶 base栈底 且栈元素是指向二叉树结点的二级指针

//建立一个空栈

int initstack(sqstack *s)

{s->base=(bitree *)malloc(STACK_INIT_SIZE*sizeof(bitree))//栈底指向开辟空间

if(!s->base) exit(1) //抛出异常

s->top=s->base //栈顶=栈尾 表示栈空

s->stacksize=STACK_INIT_SIZE //栈长度为开辟空间大小

return 1

}

//进栈

int push(sqstack *s,bitree *e)

{if(s->top-s->base>=s->stacksize) //如果栈满 追加开辟空间

{s->base=(bitree *)realloc (s->base,(s->stacksize+STACKINCREMENT)* sizeof(bitree))

if(!s->base) exit(1)//抛出异常

s->top=s->base+s->stacksize//感觉这一句没用

s->stacksize+=STACKINCREMENT}

*(s->top)=es->top++ //进栈 栈顶后移

return 1

}

//出栈

int pop(sqstack *s,bitree **e)

{if(s->top==s->base) return 0 //栈空 返回0

--s->top*e=*(s->top) //栈顶前移 取出栈顶元素给e

return 1}

//取栈顶

int gettop(sqstack *s,bitree **e)//去栈顶元素 注意top指向的是栈顶的后一个

{if(s->top==s->base) return 0 //所以 s->top-1

*e=*(s->top-1)

return 1

}

/*------------------------非递归-----先序建立二叉树----------------------------------*/

bitree *createprebitree()

{char chbitree *ht,*p,*q

sqstack *s

s=malloc(sizeof(bitree)) //加上这一句为s 初始化开辟空间

ch=getchar()

if(ch!='#'&&ch!='\n') /* 输入二叉树先序顺序 是以完全二叉树的先序顺序

不是完全二叉树的把没有的结点以#表示*/

{ht=(bitree *)malloc(sizeof(bitree))

ht->data=ch

ht->lchild=ht->rchild=NULL

p=ht

initstack(s)

push(s,ht) //根节点进栈

while((ch=getchar())!='\n') // 算

{if(ch!='#') {q=(bitree *)malloc(sizeof(bitree)) // 法

q->data=ch //

if(p==*(s->top-1)) p->lchild=q // 核

else p->rchild=q //

push(s,q)p=q // 心

} //

else {if(p==*(s->top-1)) p->lchild=NULL // 的

else p->rchild=NULL //

pop(s,&p)} // 步

//

} // 骤

return ht

}

else return NULL

}

/*--------------------------递归---------先序建立二叉树-------------------------------*/

void CreateBiTree(bitree **T) {

//按先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树,

//构造二叉链表表示二叉树

char ch

scanf("%c",&ch)

if(ch=='#') *T=NULL

else{

*T=(bitree * )malloc(sizeof(bitree))

if(!*T) exit(1)

(*T)->data=ch //生成根结点

CreateBiTree(&(*T)->lchild)//构造左子树

CreateBiTree(&(*T)->rchild)//构造右子树

}

}

/*--------------------------非递归-------中序建立二叉树-------------------------------*/

/*--------------------------递归---------中序建立二叉树-------------------------------*/

/*--------------------------非递归-------后序建立二叉树-------------------------------*/

/*--------------------------递归---------后序建立二叉树-------------------------------*/

/*-----------------------非递归------先序输出二叉树------------------------------*/

void preordertraverse(bitree *h)

{sqstack m

initstack(&m)

while(h||m.base!=m.top)

{if(h) {push(&m,h)printf("%c",h->data)h=h->lchild}

else{pop(&m,&h)

h=h->rchild}

}

}

/*------------------------非递归-----中序输出二叉树----------------------------*/

void inordertraverse(bitree *h)

{sqstack m

initstack(&m)

while(h||m.base!=m.top)

{if(h) {push(&m,h)h=h->lchild}

else {

pop(&m,&h)

printf("%c",h->data)

h=h->rchild

}

}

}

/*---------------------非递归----后序遍历二叉树----------------------------------*/

void postordertraverse(bitree *h)

{

sqstack m

initstack(&m)

while(h||m.base!=m.top)

{if(h) {

push(&m,h)

h=h->lchild}

else {

bitree *r//使用r结点表示访问了右子树 代替标志域

gettop(&m,&h)

if(h->rchild&&h->rchild!=r)

{h=h->rchild

push(&m,h)

h=h->lchild}

else{pop(&m,&h)

printf("%c",h->data)

r=hh=NULL}

}

}

}

//层次遍历二叉树 用队列 哈哈以后做

/*-------------------------------主过程-------------------------------*/

int main()

{bitree *ht

printf("先序非递归建立一个二叉树:")

if((ht=createprebitree())!=NULL) //非递归建立

//CreateBiTree(&ht)

//if(ht!=NULL)//递归建立

{

printf("先序遍历输出二叉树:")

preordertraverse(ht)

putchar('\n')

printf("中序遍历输出二叉树:")

inordertraverse(ht)

putchar('\n')

printf("后序遍历输出二叉树:")

postordertraverse(ht)

putchar('\n')

}

else printf("空二叉树\n")

}