cpp
#include <stdio.h>
#include <stdlib.h>
typedef int BiElemType;
typedef struct BiTNode {
BiElemType data;
struct BiTNode *lChild;
struct BiTNode *rChild;//左右节点
} BiTNode, *BiTree;
//辅助队列
typedef struct tag {
BiTree p;//树的某一个节点,指针类型,保存申请节点的指针
struct tag *pnext;
} tag_t, *ptag_t;
//前序遍历,深度优先遍历
int wpl = 0;
void preOrder(BiTree p, int deep) {
if (p) {
// printf("%c", p->data);
if (p->lChild == NULL && p->rChild == NULL) {//叶子节点
wpl += (p->data) * deep;
}
deep++;
preOrder(p->lChild, deep);
//递归
preOrder(p->rChild, deep);
}
}
void inOrder(BiTree p) {
if (p) {
inOrder(p->lChild);
printf("%c", p->data);
//递归
inOrder(p->rChild);
}
}
void postOrder(BiTree p) {
if (p) {
postOrder(p->lChild);
postOrder(p->rChild);
printf("%c", p->data);
//递归
}
}
int WPL(BiTree tree) {
preOrder(tree, 0);
return wpl;
}
int main() {
BiTree p;//指向新申请的树节点
BiTree tree = NULL;//初始化根节点
//队头,队尾,新节点,新节点父元素
ptag_t phead = NULL, ptail = NULL, listpnew = NULL, pucr = NULL;
char c;
while (scanf("%c", &c)) {
if (c == '\n') {
break;;
}
p = (BiTree) calloc(1, sizeof(BiTNode));
p->data = c;
listpnew = (ptag_t) calloc(1, sizeof(tag_t));//给队列节点申请空间
listpnew->p = p;
if (tree == NULL) {
tree = p;
//第一个节点既是队列头也是队列尾
phead = listpnew;
ptail = listpnew;
pucr = listpnew;
} else {
ptail->pnext = listpnew;
ptail = listpnew;
//将数放入左孩子
if (pucr->p->lChild == NULL) {
pucr->p->lChild = p;
} else if (pucr->p->rChild == NULL) {
pucr->p->rChild = p;
pucr = pucr->pnext;
}
}
}
printf("%d",WPL(tree));
// preOrder(tree);
// inOrder(tree);
// postOrder(tree);
return 0;
}