java实现重建二叉树

java实现重建二叉树题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:根据题目给出的前序遍历、后序遍历数组,首先找出根节点然后再根据中序遍历找到左子树和右子树的长度,分别构造出左右子树的前序遍历和中序遍

大家好,又见面了,我是你们的朋友全栈君。

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路:根据题目给出的前序遍历、后序遍历数组,首先找出根节点

然后再根据中序遍历找到左子树和右子树的长度,分别构造出左右子树的前序遍历和中序遍历序列

最后分别对左右子树采取递归,递归跳出的条件是序列长度为1.

比如根据题目的例子,我们由前序遍历先得到了根节点1,然后根据中序遍历,得到左子树的节点应该为{4,7,2},右子树的节点应该为{5,3,8,6}

递归对左子树处理,左子树{4,7,2}的根节点由前序遍历可得为2,那么他的左右子树由中序遍历可得为{4,7}和{} ,对{4,7}处理,可得跟节点为4,左右子树为{},{7} ,处理完毕

递归对右子树处理,右子树{5,3,8,6}的根节点为3,得到左右子树为{5}和{8,6} ,对{8,6}处理,得到根节点为6,左右子树为{8}和{} ,处理完毕

public class TreeNode{
	int data;
	TreeNode left;
	TreeNode right;
	public TreeNode(int data) {
		super();
		this.data = data;
	}
}


import java.util.HashMap;

/*
 * 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
 * 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
 * 思路:根据题目给出的前序遍历、后序遍历数组,首先找出根节点
 * 然后再根据中序遍历找到左子树和右子树的长度,分别构造出左右子树的前序遍历和中序遍历序列
 * 最后分别对左右子树采取递归,递归跳出的条件是序列长度为1.
 * */
public class 重建二叉树 {
	 public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
	        if (pre==null || in==null) {
				return null;
			}
	        HashMap<Integer, Integer> map=new HashMap<>();//中序的节点在哪个位置
	        for(int i=0;i<in.length;i++){
	        	map.put(in[i], i);
	        }
	        return preIn(pre,0,pre.length-1,in,0,in.length-1,map);
	 }
	 public TreeNode preIn(int[] p,int pi,int pj,int[] n,int ni,int nj,HashMap<Integer, Integer> map){
		 if(pi>pj){
			 return null;
		 }
		 TreeNode head=new TreeNode(p[pi]);
		 int index=map.get(p[pi]);//获得根节点在中序遍历中的位置,由此将中序遍历划分为左右子树,并递归处理
		 head.left=preIn(p,pi+1,pi+(index-ni),n,ni,index-1,map);//(index-ni)为左子树长度
	     head.right=preIn(p,pi+(index-ni)+1,pj,n,index+1,nj,map);//(index-ni+1)为右子树偏移量
	     return head;
	 }
}

C++版

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    TreeNode *head;
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        if(pre.size()!=vin.size())return nullptr;
        return rec(pre,vin);
    }
    
    TreeNode* rec(vector<int> pre,vector<int> vin){
        if(pre.size()==0 || vin.size()==0) return nullptr;
        TreeNode *node=new TreeNode(pre[0]);
        int mid=find_idx(vin, pre[0]);
        vector<int> left_pre=subv(pre,1,mid);
        vector<int> left_vin=subv(vin,0,mid);
        node->left = rec(left_pre,left_vin);
        
        vector<int> right_pre=subv(pre,mid+1,-2);
        vector<int> right_vin=subv(vin,mid+1,-2);
        node->right = rec(right_pre,right_vin);
        return node;
    }
    
    int find_idx(vector<int> v,int target){
        for(int i=0;i<v.size();i++){
            if(v[i]==target){
                return i;
            }
        }
        return -1;
    }
    
    vector<int> subv(vector<int> v,int start,int end){
        vector<int> r;
        if(end==-2){
            end=v.size()-1;
        }
        for(int i=start;i<=end;i++){
            r.emplace_back(v[i]);
        }
        return r;
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130949.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 计算机网络面试题总结

    计算机网络面试题总结一OSI与TCP/IP各层的结构与功能,都有哪些协议五层协议的体系结构1应用层域名系统HTTP协议2运输层运输层主要使用以下两种协议UDP的主要特点TCP的主要特点3网络层4数据链路层5物理层总结一下二TCP三次握手和四次挥手(面试常客)为什么要三次握手为什么要传回SYN传了SYN,为啥还要传ACK为什么要四次挥手…

  • Vue项目运行报错:解决webpack版本问题「建议收藏」

    Vue项目运行报错:解决webpack版本问题「建议收藏」解决“Error:Rulecanonlyhaveoneresourcesource(providedresourceandtest+include+exclude)”前面也会报错找不到webpack,在package-lock.json里查找之,发现安装的版本竟然是5.1.0,而没有更新过依赖,可以正常编译的项目里都是4.x。那基本可以确认了。步骤:先删掉node_modules和package-lock.json手动在package.json

  • 前端_单页面开发_web前端框架

    前端_单页面开发_web前端框架   web移动端单页面开发,可适用于web端直接开发。本例需要使用require.js帮助实现。   单页面开发个人理解:对一个项目里面的所有html文件都拥有同一个url,通过hash值的改变来促发页面的跳转(hash为url后面的内容,如下面的#red和#green就是hash),如两个页面的url分别为(http://localhost:8000/views/index.htm…

    2022年10月13日
  • 多节点服务器定时任务重复处理的问题

    多节点服务器定时任务重复处理的问题项目中有使用Spring定时执行任务的需求,用户可以自定义时间(半小时或整点)去生成需要的报表并发送邮件到用户自己的邮箱。项目里面提供的时间是半小时或整点去执行Spring定时任务,查询数据库中有哪些Schedule是满足要求的,然后去执行那些符合条件的任务。一切功能表现正常,但是项目部署在服务器上后,用户反映在同一时间会收到两封相同的邮件。我们检查了代码和SpringSchedule本

  • gmt时间和cst时间_时区utc是什么意思

    gmt时间和cst时间_时区utc是什么意思全球24个时区的划分相较于两地时间表,可以显示世界各时区时间和地名的世界时区表(WorldTime),就显得精密与复杂多了,通常世界时区表的表盘上会标示着全球24个时区的城市名称,但究竟这24个时

  • Jenkins部署及使用(安装maven配置阿里云镜像、git工具)

    Jenkins部署及使用(安装maven配置阿里云镜像、git工具)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号