求指定结点到根的路径c语言,求从根节点到每一个叶子节点的路径的值的和

#include

#include

#include

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef int ElemType;

typedef struct BiTNode

{

int data;

struct BiTNode *lchild, *rchild;

} BiTNode, *BiTree;

typedef struct sqStack

{

ElemType *base;

ElemType *top;                // 用于标注栈顶的位置

int stackSize;

}sqStack;

//全局栈

sqStack s;

//初始化栈

void initStack(sqStack *s)

{

s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) );

if( !s->base )

exit(0);

s->top = s->base;   // 最开始,栈顶就是栈底

s->stackSize = STACK_INIT_SIZE;

}

//入栈

void Push(sqStack *s, ElemType e)

{

// 如果栈满,追加空间

if( s->base - s->top >= s->stackSize ) // 这个根据自己的编译器 和 系统,来决定 s->base - s->top 还是 s->top - s->base

{

s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));

if( !s->base )

exit(0);

s->top = s->base + s->stackSize;              // 设置栈顶

s->stackSize = s->stackSize + STACKINCREMENT; // 设置栈的最大容量

}

*(s->top) = e;

s->top++;

}

//出栈

void Pop(sqStack *s, ElemType *e)

{

if( s->top == s->base )  // 栈已空空是也

return ;

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

}

//判断栈是否空

int IsEmpty(sqStack *s){

if( s->top == s->base )

return 0;

else

return 1;

}

// 创建一棵二叉树,约定用户遵照前序遍历的方式输入数据

void CreateBiTree(BiTree *T)

{

char c;

scanf("%c", &c);

if( '#' == c )

{

*T = NULL;

}

else

{

*T = (BiTNode *)malloc(sizeof(BiTNode));

(*T)->data = c;

CreateBiTree(&(*T)->lchild);

CreateBiTree(&(*T)->rchild);

}

}

// 访问二叉树结点的具体操作,你想干嘛?!

void visit(char c, int level)

{

printf("%c 位于第 %d 层\n", c, level);

}

// 前序遍历二叉树

void PreOrderTraverse(BiTree T, int level)

{

if( T )

{

visit(T->data, level);

PreOrderTraverse(T->lchild, level+1);

PreOrderTraverse(T->rchild, level+1);

}

}

void AllPath(BiTree T,char path[],int pathLength)

{

if(T!=NULL)

{

if(T->lchild==NULL&&T->rchild==NULL)

{

path[pathLength]=T->data;

printf("根节点到%c叶子节点的路径为: ",T->data);

int xnum = 0;

for(int i=0;i<=pathLength;i++){

printf("%c ",path[i]);

xnum = path[i] - 48 + xnum * 10 ;// 将树中元素 char 转为 int

}

Push(&s, xnum);

//printf(" x=%d \n",xnum);

printf("\n");

}

else

{

path[pathLength++]=T->data;

AllPath(T->lchild,path,pathLength);

AllPath(T->rchild,path,pathLength);

pathLength--;

}

}

}

int main()

{

//int level = 1;

BiTree T = NULL;

int sum = 0,e;

initStack(&s);

char path[100];

int pathLength=0;

CreateBiTree(&T);

AllPath(T,path,pathLength);

//PreOrderTraverse(T, level);

while( IsEmpty(&s) ){

Pop(&s, &e);

//printf("sum = %d\n",sum);

sum += e;

}

printf("sum = %d\n",sum);

return 0;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值