将任意一颗二叉树转变为每一个节点都是另外两个孩子节点的和

             50
           /     \     
         /         \
       8             2
     / \             /\
   /     \          /   \
  3        5      1      30
           
package tree;

public class ConvertSumP {

	/**
	 * 将任意一颗二叉树转变为每一个节点都是另外两个孩子节点的和,要求
	 * 只能增加某一个节点的值,节点为null视为0
	 * @param args
	 */
	public static void convert(TreeNode root){
		if(root==null||(root.left==null&&root.right==null)) return;
		convert(root.left);
		convert(root.right);
		int left = getsum(root.left);
		int right = getsum(root.right);
		if(root.value==left+right){
			return;
		}else if(root.value<left+right){
			root.value = left+right;
		}else{
			if(root.left!=null){
				root.left.value+=root.value-left-right;
				convert(root.left);
			}else{
				root.right.value += root.value-left-right;
				convert(root.right);
			}
		}
	}
	private static int getsum(TreeNode root) {
		if(root==null) return 0;
		return root.value;
	}
	public static void print(TreeNode root){
		if(root==null) return;
		System.out.print(root.value+" ");
		print(root.left);
		print(root.right);
	}
	public static void main(String[] args) {
		

		TreeNode root = new TreeNode(50);
		root.left = new TreeNode(7);
		root.right = new TreeNode(2);
		root.left.left = new TreeNode(3);
		root.left.right = new TreeNode(5);
		//root.right.left = new TreeNode(1);
		root.right.right = new TreeNode(30);
		print(root);
		convert(root);
		System.out.println();
		print(root);

	}

}

50 / \ / \ 19 31 / \ / \ / \ / \14 5 1 30

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题可以使用深度优先搜索(DFS)来解决。我们可以从根节点开始,递归地遍历二叉树,并将当前结点的值加到当前的和中。如果当前结点是叶子节点且当前和等于目标和,那么就找到了一条路径。如果当前结点不是叶子节点,则继续向左子树和右子树递归,直到遍历完整个树。 具体的算法如下: 1. 如果根节点为空,则直接返回空。 2. 定义一个全局变量count,用于记录路径的数量。 3. 定义一个辅助函数findPath,该函数用于递归地遍历二叉树。该函数接收两个参数:当前结点和当前和。 4. 在findPath函数中,首先将当前结点的值加到当前的和中。 5. 如果当前结点是叶子节点且当前和等于目标和,将count加1。 6. 如果当前结点有左子树,则递归调用findPath函数,将左子树作为当前结点进行遍历。 7. 如果当前结点有右子树,则递归调用findPath函数,将右子树作为当前结点进行遍历。 8. 最后,在主函数中调用findPath函数,将根节点和目标和作为参数传入。 9. 返回count的值作为结果。 这样就可以找出二叉树中结点值的和为目标和的路径数量。 注意:以上算法假设路径的起始结点可以是任意结点,不一定非要是根节点。如果要求路径必须从根节点开始,则需要在递归调用findPath函数时,传入当前结点左右子树的和,而不是传入当前结点的和

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值