分为偷根结点和不偷根结点两种情况
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stddef.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define LIST_INIT_SIZE 100
#define STACK_INIT_SIZE 100
typedef int Status;
int nums[100],numno=0;
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree;
//输入先序序列,创建二叉树
void CreateBiTree(BiTree &T)
{ int ch;
scanf("%d",&ch);
if (ch ==-1) T = NULL;
else
{ T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void Value(BiTree root, int *value)
{
if(root == NULL) {
value[0] = value[1] = 0;
return;
}
// value[0]表示偷当前节点的最大金额
// value[1]表示不偷当前节点的最大金额
int left[2], right[2];
Value(root->lchild, left);
Value(root->rchild, right);
//不偷当前结点,则可以选择偷或不偷左右节点中金额较大的
value[0] = fmax(left[0], left[1]) + fmax(right[0], right[1]);
//偷当前节点,不能偷左右节点
value[1] = root->data + left[0] + right[0];
}
int main()
{ BiTree T;
CreateBiTree(T);
int result[2];
Value(T, result);
//输出偷或不偷根节点中的较大值
printf("%d", (int)fmax(result[0], result[1]));
return 0;
}