get (tree node val - (subtree val sum))

63 篇文章 0 订阅

给一个tree,返回每个点左右子树的和与自己值的差,用递归做,还问了不递归怎么做

package tree;

import java.util.*;

import z_dataStructure.TreeNode;

public class TreeNodeMinusSubtreeSum {

	public static void main(String[] args) {
		TreeNode root = new TreeNode(1);
		TreeNode node2 = new TreeNode(2);
		TreeNode node3 = new TreeNode(3);
		TreeNode node4 = new TreeNode(4);
		TreeNode node5 = new TreeNode(5);
		root.left = node2;
		root.right = node3;
		node3.left = node4;
		node3.right = node5;

		for (int subsum : treeNodeWithSubtreeSum(root)) {
			System.out.println(subsum);
		}
		ArrayList<Integer> res = new ArrayList<Integer>();
		treeNodeWithSubtreeSum1(root, res);
		for (int subsum : res) {
			System.out.println(subsum);
		}
	}
	
	public static int treeNodeWithSubtreeSum1(TreeNode root, ArrayList<Integer> res){
		if (root == null) {
			return 0;
		}
		int leftSubtree = treeNodeWithSubtreeSum1(root.left, res);
		int rightSubtree = treeNodeWithSubtreeSum1(root.right, res);
		int sum = root.val - leftSubtree - rightSubtree;
		res.add(sum);
		return root.val + leftSubtree + rightSubtree;
	}
	
	 public static ArrayList<Integer> treeNodeWithSubtreeSum(TreeNode root) {
         ArrayList<Integer> ret = new ArrayList<Integer>();
         if (root == null)
                 return ret;
         Stack<TreeNode> s = new Stack<TreeNode>();
         HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
         s.add(root);
         TreeNode pre = null;
         while (!s.isEmpty()) {
                 TreeNode cur = s.peek();
                 if (pre == null || pre.left == cur || pre.right == cur) {
                         if (cur.left != null) {
                                 s.push(cur.left);
                         } else if (cur.right != null) {
                                 s.push(cur.right);
                         } else {
                                 s.pop();
                                 map.put(cur.val, 0);
                                 ret.add(cur.val - map.get(cur.val));
                         }
                 } else if (cur.left == pre) {
                         if (cur.right != null) {
                                 map.put(cur.val, map.get(pre.val) + pre.val);
                                 s.push(cur.right);
                         } else {
                                 s.pop();
                                 map.put(cur.val, map.get(pre.val) + pre.val);
                                 ret.add(cur.val - map.get(cur.val));
                         }
                 } else if (cur.right == pre) {
                         s.pop();
                         int tmp = 0;
                         if (map.containsKey(cur.val))
                                 tmp = map.get(cur.val);
                         tmp += map.get(pre.val) + pre.val;
                         map.put(cur.val, tmp);
                         ret.add(cur.val - map.get(cur.val));
                 }
                 pre = cur;
         }
         return ret;
 }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值