根据前序和中序遍历序列构造二叉树

Posted on 2022-07-06 15:09  kfy  阅读(34)  评论(0)    收藏  举报
#### 根据前序和中序遍历序列构造二叉树
要点
- 读懂前序和中序遍历,他所拥有的性质
- 如何构造二叉树---js的构造函数
-如何获得根结点的下标--indexOf
-如何用递归--递归什么

 

 

*代码实现*
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} preorder
 * @param {number[]} inorder
 * @return {TreeNode}
var buildTree = function (preorder, inorder) {
    if(preorder.length==0&&inorder.length==0)return null;
    let i=inorder.indexOf(preorder[0]);
  let root=new TreeNode(preorder[0]);
  let lp=preorder.slice(1,i+1);
  let rp=preorder.slice(i+1,preorder.length);
  let li=inorder.slice(0,i);
  let ri=inorder.slice(i+1,inorder.length);
 root.left= buildTree(lp,li);
 root.right= buildTree(rp,ri);
  return root;
};

 //1.先写出构造函数--返回一个数组
 //2.要写出根结点的下标
 //3.根据下标去分数组
 //4.要给构造的数组--变成二叉树,就需要给每个root加左右孩子结点
//即在该作用域内把递归接收返回值做为root的左右孩子
//5.如果递归到最后长度是0呢?-左右孩子都为null
笔记
关于indexof 和对象解构
indexof是找数组中某个元素的下标
对象解构是找对象中的某个属性的值
const b=['a','b','c','d','e'];
const c={
    a:66,
    b:45
}
const d =['c','d','a']
/* console.log(a.indexOf(a[b[4]])); */
/* console.log(c[b[0].toLocaleLowerCase()]); */
console.log(b[d[2]]);//实际就是b['a'],但俩个数组,肯定无法实现解构,这里会是undefined
console.log(c[b[0]]);//c为对象,可以在对象里找数组某个元素【即对象的属性名】的属性值
console.log(d.indexOf(b[0]));//这个为两数组的检验下标--注意与解构的区别

构造函数--构造二叉树的必需品

纯copy的,只为做自己的笔记温习

举个例子,我们要录入一年级一班中每一位同学的个人信息,那么我们可以创建一些对象,比如:

var p1 = { name: 'zs', age: 6, gender: '男', hobby: 'basketball' };
var p2 = { name: 'ls', age: 6, gender: '女', hobby: 'dancing' };
var p3 = { name: 'ww', age: 6, gender: '女', hobby: 'singing' };
var p4 = { name: 'zl', age: 6, gender: '男', hobby: 'football' };

 

像上面这样,我们可以把每一位同学的信息当做一个对象来处理。但是,我们会发现,我们重复地写了很多无意义的代码。比如 name、age、gender、hobby 。如果这个班上有60个学生,我们得重复写60遍。

这个时候,构造函数的优势就体现出来了。我们发现,虽然每位同学都有 name、gender、hobby这些属性, 但它们都是不同的,那我们就把这些属性当做构造函数的参数传递进去。而由于都是一年级的学生,age 基本都是6岁,所以我们就可以写死,遇到特殊情况再单独做处理即可。此时,我们就可以创建以下的函数:

function Person(name, gender, hobby) {
    this.name = name;
    this.gender = gender;
    this.hobby = hobby;
    this.age = 6;
}

 

当创建上面的函数以后, 我们就可以通过 new 关键字调用,也就是通过构造函数来创建对象了。

var p1 = new Person('zs', '男', 'basketball');
var p2 = new Person('ls', '女', 'dancing');
var p3 = new Person('ww', '女', 'singing');
var p4 = new Person('zl', '男', 'football');

 

此时你会发现,创建对象会变得非常方便。所以,虽然封装构造函数的过程会比较麻烦,但一旦封装成功,我们再创建对象就会变得非常轻松,这也是我们为什么要使用构造函数的原因。

在使用对象字面量创建一系列同一类型的对象时,这些对象可能具有一些相似的特征(属性)和行为(方法),此时会产生很多重复的代码,而使用构造函数就可以实现代码复用。