问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

二叉树的重建算法是什么

发布网友 发布时间:2022-05-10 21:40

我来回答

3个回答

懂视网 时间:2022-05-14 21:49

这篇文章给大家介绍的内容是关于js实现重建二叉树的算法解析,有着一定的参考价值,有需要的朋友可以参考一下。

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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”为1的左子树上的节点,“5,3,8,6”为1的右子树上的节点,这样递归的分解下去即可

代码实现

/* function TreeNode(x) {
 this.val = x;
 this.left = null;
 this.right = null;
} */
function reConstructBinaryTree(pre, vin)
{
 var root = recon(0, pre.length-1, pre, 0, vin.length-1, vin);
 return root;
}

function recon(preStart, preEnd, pre, vinStart, vinEnd, vin){
 if(preStart > preEnd || vinStart > vinEnd) {
 return null;
 }

 var node = new TreeNode(pre[preStart]);

 for(var i = vinStart;i <= vinEnd;i++) {
 if(vin[i] === pre[preStart]){
  node.left = recon(preStart+1, preStart+i-vinStart, pre, vinStart, i-1, vin);
  node.right = recon(preStart+i-vinStart+1, preEnd, pre, i+1, vinEnd, vin);
 }
 }

 return node;
}

热心网友 时间:2022-05-14 18:57

这个算法其实很简单的。
首先你自己要能够根据先序和中序能够手动的建立起来树。
先序串:DBACEGF,先序的第一个节点一定是根节点,这样我们就知道了根节点是D.
再看中序, 在中序串之中,根结点的前边的所有节点都是左子树中,ABCDEFG,所以D节点前面的ABC就是左子树的中序串。再看前续串 DBACEGF, 由于左子树的节点是ABC,我们可以得到左子树的前续周游的串为: BAC. 有了左子树的前序串BAC,和中序串ABC ,我们就可以递归的把左子树给建立起来。 同样,可以建立起右子树。

class TreeNode
{
pubic:
char value;
TreeNode *left;
TreeNode *right;
TreeNode(char c): value(c){
left = NULL;
rigth = NULL;
}
~TreeNode() {
if(left != NULL) delete left;
if(right != NULL) delete right;
}
};

TreeNode* buildTrece(char *pre, char *mid, int n)
{
if (n==0) return NULL;

char c = pre[0];
TreeNode *node = new TreeNode(c); //This is the root node of this tree/sub tree.

for(int i=0; i<n && mid[i]!=c; i++);
int lenL = i; // the node number of the left child tree.
int lenR = n - i -1; // the node number of the rigth child tree.

//build the left child tree. The first order for thr left child tree is from
// starts from pre[1], since the first element in pre order sequence is the root
// node. The length of left tree is lenL.
if(lenL > 0) node->left = buildTree(&pre[1], &mid[0], lenL);

//build the right child tree. The first order stree of right child is from
//lenL + 1(where 1 stands for the root node, and lenL is the length of the
// left child tree.)
if(lenR > 0) node->right = buildTree(&pre[lenL+1], &mid[lenL+1], lenR);

return node;
}

热心网友 时间:2022-05-14 20:15

太难了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
QQ视频过期了怎么恢复正常呢? 有没有酒友买了曜隐今年那款牛年纪念版酱酒啊,想问一下这个纪念版的包装... 买过曜隐酱酒的朋友觉得他们的包装怎么样呀,看起来高端显品位吗?_百 ... 最近收到客户送的一瓶曜隐酱酒,觉得这个酒的瓶盖很有特色哇,大家知道... 我的用Psiloc irRemote不知道这么用 TOSHIBA东芝55U3800C PRO液晶电视推荐 电视设置了每天12点定时关机,有一天11点就提前手动关电视了,定时设置需 ... 变频器维修,维修变频器电路板 建行帐号指的是什么 癌症临床表现 癌症的症状有哪些 煎牛排怎么腌制? 股票除息日可不可以交易股票? 我的手机在微博上获取位置数据失败,这是什么原因? 微博拟上线了真实地理位置的功能,你如何看待这个功能? 高职高专学校有哪些 深圳公办职高有哪些学校 10690759888是什么电话号码 NBA2K14的真实GS nba2k14参数设置属性 持球防守 多少 符合实际啊 求一份NBA2K14的游戏参数,我发现2K14在和舍友对战的时候,防守太不给力,贴不住人 这个配置玩nba2k14怎样,开多大特效,配置如下: 184是什么电话 求nba2k11和nba2k14最低配置要求对比 NBA2K14默认的游戏参数是多少? 184 1328 6395是啥号码? NBA2K14 电脑配置 184是什么地方的电话号码 nba2k14最低配置 想玩NBA2K14的话这样的配置需要什么样的显卡 NBA2K14配置 二叉树重建递归程序详解 至少需要知道前,中,后序遍历中的几种,就能重建二叉树?有无现成代码? 从先序中序重建二叉树输出层序后序 有关重建二叉树,请教两句代码 重建二叉树,已知中序和后序遍历顺序,求先序遍历次序。 C++中如果知道了二叉树的前序和中序遍历,怎么知道后序遍历?有点急~ C++中怎样以文本形式输出二叉树? C语言中如何将一个链表保存为文件? 脸上的痘印痘坑可以用激光点阵吗,像我这种做完一次多长时间 与网络时间同步 关于中秋节的小报 粗旷的男声唱的撕心裂肺的歌手? 找一首伤感英文歌 男生唱的 高音很好听 有种撕心裂肺的感觉 求一首男生高音英文歌,是一首很好听的歌曲只是记得*部分是撕心裂肺的啊··啊·啊 一首男生说唱叫什么回来,歌词有让我死心,男的撕心裂肺喊的,最近很流行的! 是哭着说唱的歌曲,想要挽留自 比较撕心裂肺的韩文歌曲 抖音里盲僧慢放的配音《开始懂了》是谁唱的?一个男的唱的撕心裂肺的那种。 嗓音粗的男生适合唱什么歌 梁静茹的情歌,男生唱起来会有什么感觉· 歌是男的唱的,歌词里面有想你的365天,这首歌名字叫什么?