leetcode337打家劫舍③|C语言题解

102 阅读1分钟

分为偷根结点和不偷根结点两种情况

#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;
}