打劫房屋III

在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,
 * 但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树。
 * 与前两次偷窃相似的是每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,
 * 且当相邻的两个房子同一天被打劫时,该系统会自动报警。
算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情况下。
样例
  3
 / \
2   3
 \   \ 
  3   1
窃贼最多能偷窃的金钱数是 3 + 3 + 1 = 7.


    3
   / \
  4   5
 / \   \ 
1   3   1

窃贼最多能偷窃的金钱数是 4 + 5 = 9.


import java.util.Scanner;

/**
 * 在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,
 * 但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树。
 * 与前两次偷窃相似的是每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,
 * 且当相邻的两个房子同一天被打劫时,该系统会自动报警。
算一算,如果今晚去打劫,你最多可以得到多少钱,当然在不触动报警装置的情况下。
样例
  3
 / \
2   3
 \   \ 
  3   1
窃贼最多能偷窃的金钱数是 3 + 3 + 1 = 7.

    3
   / \
  4   5
 / \   \ 
1   3   1
窃贼最多能偷窃的金钱数是 4 + 5 = 9.
 * 
 * @author Dell
 *
 */
public class Test535 {
   public static int houseRobber3(TreeNode root)
   {
	   if(root==null)
	    return 0;
	   int[] result=postorder(root);
	   return Math.max(result[0], result[1]);
   }
   public static int[] postorder(TreeNode root)
   {    
	   if(root==null)
	   {
		   return new int[]{0,0};
	   }
	      int[] result=new int[2];
	      int[] left=postorder(root.left);
	      int[] right=postorder(root.right);
	     //拿当前节点
	      result[0]=left[1]+right[1]+root.val;
	      //不拿当前节点
	      result[1]=Math.max(left[0], left[1])+Math.max(right[0], right[1]);
	    return result; 
   }
   public static TreeNode CreatTree(TreeNode t) //先序创建一颗二叉树,空节点用#代替
   {
	   Scanner sc=null;
	   sc=new Scanner(System.in);
	   
	  t=creatNode(t,sc);
	  return t;
   }
   
	private static TreeNode creatNode(TreeNode t, Scanner sc) {
	    String temp=sc.next();
		if(temp.trim().equals("#"))
		{
			return null;
		}
		else
		{
			t=new TreeNode(Integer.parseInt(temp));
			t.left=creatNode(t.left,sc);
			t.right=creatNode(t.right,sc);
			return t;
		}	
}
	public static void midorder(TreeNode t)
	{
		if(t!=null)
		{
			midorder(t.left);
			System.out.print(t.val+" ");
			midorder(t.right);
		}
		
	}
	public static void main(String[] args) {
		TreeNode t=null;
		t=CreatTree(t);
		//midorder(t);
   System.out.println(houseRobber3(t));
	}

}

测试:如下面这颗二叉树

    3

  /   \

4    5

 \    / \

  6  7  9

     /

    8

则在程序中的输入输出为:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值