当前位置: 首页 > news >正文

将满二叉树转换为求和树

给满出二叉树,编写算法将其转化为求和树

什么是求和树:二叉树的求和树, 是一颗同样结构的二叉树,其树中的每个节点将包含原始树中的左子树和右子树的和。

二叉树:
                  10
               /      \
             -2        6
           /   \      /  \ 
          8    -4    7    5

求和树:
                 20(4-2+12+6)
               /      \
           4(8-4)      12(7+5)
            /   \      /  \ 
          0      0    0    0

二叉树给出前序和中序输入,求和树要求中序输出;
所有处理数据不会大于int;


输入描述:
2行整数,第1行表示二叉树的前序遍历,第2行表示二叉树的中序遍历,以空格分割

输出描述:
1行整数,表示求和树的中序遍历,以空格分割

输入例子1:
10 -2 8 -4 6 7 5
8 -2 -4 10 7 6 5

输出例子1:
0 4 0 20 0 12 0

import java.util.Scanner;

public class Main {
	
	public static class TreeNode{
		int value;
		TreeNode left;
		TreeNode right;
		int old_value;
 		TreeNode(int value, TreeNode left, TreeNode right){
			this.value = value;
			this.left = left;
			this.right = right;
		}
	}
	
	public static TreeNode construct(int[] pre, int p_start, int p_end, int[] in, int i_start, int i_end) {
		if(p_end<p_start || i_start>i_end) {
			return null;
		}
		int index = -1;
		TreeNode root = new TreeNode(pre[p_start], null, null);
		for(int i=i_start; i<=i_end; i++) {
			if(in[i]==pre[p_start])
				index = i;
		}
		root.left = construct(pre, p_start+1, p_start+index-i_start, in, i_start, index-1);
		root.right = construct(pre, p_start+index-i_start+1, p_end, in, index+1, i_end);
		return root;
		
	}
	
	public static void back_order(TreeNode root) {
		if(root==null)
			return;
		if(root.left==null && root.right==null)
				{root.old_value = root.value; root.value=0; return;}
		back_order(root.left);
		back_order(root.right);
		int old_left_value = (root.left!=null)? root.left.old_value:0;
		int old_right_value = (root.right!=null)? root.right.old_value: 0;
		root.old_value = root.value + old_left_value + old_right_value;
		root.value = old_left_value + old_right_value;
		
	}
	
	public static void in_print(TreeNode root) {
		if(root==null)
			return;
		in_print(root.left);
		System.out.print(root.value);
		System.out.print(" ");
		in_print(root.right);
	}
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		String pre_str = scan.nextLine();
		String[] p = pre_str.split(" ");
		int [] pre = new int[p.length];
		int i = 0;
		for(String s: p) {
			pre[i++] = Integer.parseInt(s);
		}
		String in_str = scan.nextLine();
		String [] in = in_str.split(" ");
		i = 0;
		int [] in_list = new int[in.length];
		for(String s: in) {
			in_list[i++] = Integer.parseInt(s);
		}
		
		TreeNode root = construct(pre, 0, pre.length-1, in_list, 0, in_list.length-1);
		back_order(root);
		in_print(root);
	}
}

相关文章:

  • JavaBean的学习
  • 排版页数
  • 最长回文串
  • 分享:Sersync试用
  • pstreegdb
  • 一点正则表达式的学习碎片
  • 链表分割
  • void*
  • python requests.session 与 requests
  • 爬虫_urlencode问题
  • 如何实现MySQL的自动备份
  • 魔术索引
  • PIC数据采集系统---接口功能测试
  • 字符串排列
  • 数组中的逆序对
  • IDEA 插件开发入门教程
  • iOS | NSProxy
  • JS基础之数据类型、对象、原型、原型链、继承
  • mysql中InnoDB引擎中页的概念
  • PHP 的 SAPI 是个什么东西
  • php的插入排序,通过双层for循环
  • Redis 懒删除(lazy free)简史
  • SQLServer之索引简介
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 从0实现一个tiny react(三)生命周期
  • 给github项目添加CI badge
  • 基于axios的vue插件,让http请求更简单
  • 看域名解析域名安全对SEO的影响
  • 前端技术周刊 2019-01-14:客户端存储
  • 物联网链路协议
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​什么是bug?bug的源头在哪里?
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #pragma pack(1)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (1)虚拟机的安装与使用,linux系统安装
  • (2)MFC+openGL单文档框架glFrame
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (独孤九剑)--文件系统
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm码农论坛 毕业设计 231126
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (算法)N皇后问题
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .aanva
  • .net core控制台应用程序初识
  • .NET Standard 的管理策略
  • .Net 高效开发之不可错过的实用工具
  • .Net7 环境安装配置
  • .NET面试题(二)