博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法(树) --javascript语言描述
阅读量:6690 次
发布时间:2019-06-25

本文共 2987 字,大约阅读时间需要 9 分钟。

重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路:二叉树前序遍历第一个点为根节点,中序遍历顺序为先左子树然后根节点最后右子树。所以先通过前序遍历找出根节点,然后将中序遍历分为左右子树两组,最后对于每个子树依次递归调用。

function TreeNode(x) {    this.val = x;    this.left = null;    this.right = null;}//pre为前序遍历序列数组 vin为中序遍历序列数组function reConstructBinaryTree(pre, vin){  if(pre.length == 0 || vin.length == 0) {    return null;  }  let root = new TreeNode(pre[0]);  //根节点在中序遍历中的位置  let index = vin.indexOf(pre[0]);  let leftPre = pre.slice(1,index+1);//前序左子树  let rightPre = pre.slice(index+1);//前序右子属  let leftVin = vin.slice(0,index);//中序左子树  let rightVin = vin.slice(index+1);//中序右子树  //开始递归  root.left = reConstructBinaryTree(leftPre,leftVin);  root.right = reConstructBinaryTree(rightPre,rightVin);  return root;}console.log(reConstructBinaryTree([1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]));

二叉树的下一个节点

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路:根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况:1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;2、没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点;3、如果不是其父节点的左孩子,则把其父节点作为下一个遍历的节点,向上回溯,直到找到父节点没有父节点并且父节点是父节点的父节点的左孩子为止。综合这三种情况就可以找到二叉树中任意一个节点的下一个节点。

function TreeNode(x) {    this.val = x;    this.left = null;    this.right = null;    this.parent = null;}function getNext(node) {  let curNode = null;  //第一、判断是否有右孩子  if(node.right != null) {    curNode = node.right;    while(curNode.left !=null) {      curNode = curNode.left;    }    return curNode;  }  //第二、判断是否是其父节点的左孩子  if(node.parent == null) {    return null;  }  if(node.parent.left == node) {    return node.parent;  }  //第三、向上找其父节点,直到父节点是其父节点的父节点的左孩子  curNode = node.parent;  while(curNode.parent != null) {    if(curNode == curNode.parent.left) {      return curNode.parent;    }    curNode = curNode.parent;  }  return null;}//构建二叉树let parentNode = createTree(  ['a','b','d','e','h','i','c','f','g'],  ['d','b','h','e','i','a','f','c','g']);let i = parentNode.left.right.right;//i节点let b = parentNode.left;//b节点let f = parentNode.right.left;//f节点console.log(getNext(i).val);//aconsole.log(getNext(b).val);//hconsole.log(getNext(f).val);//c//根据前序遍历和中序遍历构建一颗二叉树function createTree(pre,vin){  function TreeNode(x) {      this.val = x;      this.left = null;      this.right = null;      this.parent = null;  }  //pre为前序遍历序列数组 vin为中序遍历序列数组  function reConstructBinaryTree(pre, vin,parent){    if(pre.length == 0 || vin.length == 0) {      return null;    }    let root = new TreeNode(pre[0]);    //根节点在中序遍历中的位置    let index = vin.indexOf(pre[0]);    let leftPre = pre.slice(1,index+1);//前序左子树    let rightPre = pre.slice(index+1);//前序右子属    let leftVin = vin.slice(0,index);//中序左子树    let rightVin = vin.slice(index+1);//中序右子树    //开始递归    root.parent = parent;    root.left = reConstructBinaryTree(leftPre,leftVin,root);    root.right = reConstructBinaryTree(rightPre,rightVin,root);    return root;  }  return reConstructBinaryTree(pre,vin,null);}

转载地址:http://fzuoo.baihongyu.com/

你可能感兴趣的文章
linux中awk学习小结
查看>>
WCF分布式开发常见错误(23):the fact that the server certificate isn't configured with HTTP.SYS...
查看>>
第一个Indigo Service
查看>>
《Pro ASP.NET MVC 3 Framework》学习笔记之三十二 【无入侵的Ajax】
查看>>
监听启动报TNS-12537、TNS-12560错误
查看>>
XXX管理平台系统——项目教训
查看>>
会写代码的项目经理
查看>>
通过Lua解释器来扩展丰富nginx功能,实现复杂业务的处理
查看>>
禁用WPF窗体的最大化按钮
查看>>
玩转React样式
查看>>
TinyHttpd中sockaddr与struct sockaddr_in的区别
查看>>
嘉峪关市与甘肃省广电网络公司对接智慧城市建设项目
查看>>
PostgreSQL 收缩膨胀表或索引 - pg_squeeze or pg_repack
查看>>
代码实现从某个表中查询数据插入到另一个表中
查看>>
提高代码质量-工具篇
查看>>
require() 源码解读
查看>>
kvm虚拟化学习笔记(十六)之kvm虚拟化存储池配置
查看>>
★Kali信息收集~ 5.The Harvester:邮箱挖掘器
查看>>
普通web项目转化为maven web项目
查看>>
android 内部文件读取
查看>>