树形结构和二叉树的遍历(前中后)

1.树形结构

  • 树形结构有一个根节点;
  • 树是一种有向无环的图;
  • 树形结构没有回路;

概念:

根节点:最开始的节点;
叶子结点:没有子节点;
节点:除去根节点和叶子结点后的普通节点;
数的度:树的分叉中,具有最多的分叉,即度为分叉的个数;
树的深度:树最深有几层,深度就为几;

2.二叉树

定义二叉树构建函数

function Node(value){
    this.value=value;
    this.left=null;
    this.right=null;
}

满二叉树

  • 所有叶子结点都在最底层
  • 每个非叶子节点都有两个节点

完全二叉树

国内定义:

  • 叶子结点都在最后一层或在倒数第二层;
  • 叶子结点都向左聚拢;

国外定义:

  • 叶子结点都在最后一层或在倒数第二层;
  • 如果有叶子节点,就必然有两个叶子结点;

二叉树中子树

子树:二叉树中,每一个节点或叶子节点都是一颗子树的根节点;

左子树、右子树:

3.二叉树的遍历

前序遍历

先打印当前的,再打印左边的,再打印右边的

代码实现

 function bianli(root){
     if(root==null) return;
     console.log(root.value);
     bainli(root.left);
     bianli(root.right);
 }

中序遍历

先打印左边的,再打印中间的,再打印右边的

代码实现

  function bianli(root){
     if(root==null) return;
     bainli(root.left);
     console.log(root.value);
     bianli(root.right);
 }

后续遍历

先打印左边的,再打印右边的,再打印中间的

代码实现

   function bianli(root){
     if(root==null) return;
     bainli(root.left);
     bianli(root.right);
     console.log(root.value);
 }

4.二叉树还原

根据前序和中序还原后续

代码实现

var qian = ['a', 'c', 'f', 'g', 'b', 'd', 'e'];
var zhong = ['f', 'c', 'g', 'a', 'd', 'b', 'e'];

function Node (value){
    this.value=value;
    this.left=null;
    this.right=null;
}

function f1(qian,zhong){
    if(qian==null||zhong==null||qian.length==0||zhong.length==0||qian.length!=zhong.length) return;
    var root=new Node(qian[0]);
    var index=zhong.indexOf(root.value);//找到根节点在中序遍历中的位置
    var qianLeft=qian.slice(1,1+index);//前序遍历的左子树
    var qianRight=qian.slice(1+index,qian.length);//前序遍历的右子树
    var zhongLeft=zhong.slice(0,index);//中序遍历的左子树
    var zhongRight=zhong.slice(index+1,zhong.length);//中序遍历的右子树
    root.left=f1(qianLeft,zhongLeft);//根据左子树的前序和中序还原左子树并赋值给root.left
    root.right=f1(qianRight,zhongRight);//根绝右子树的前序和中序还原右子树并赋值给root.right
    return root;
}

var root = f1(qian, zhong);
console.log(root.left);
console.log(root.right);

根据中序和后续还原前序

代码实现

var zhong = ['f', 'c', 'g', 'a', 'd', 'b', 'e'];
var hou = ['f', 'g', 'c', 'd', 'e', 'b', 'a'];

function Node(value) {
    this.value = value;
    this.left = null;
    this.right = null;
}

function f1(zhong, hou) {
    if (zhong == null || hou == null || zhong.length == 0 || hou.length == 0 || zhong.length != hou.length) return null;
    var root = new Node(hou[hou.length - 1]);
    var index = zhong.indexOf(root.value);

    var leftZhong = zhong.slice(0, index);
    var rightZhong = zhong.slice(index + 1, zhong.length);
    var leftHou = hou.slice(0, index);
    var rightHou = hou.slice(index, hou.length - 1);

    root.left = f1(leftZhong, leftHou);
    root.right = f1(rightZhong, rightHou);
    return root;
}
var root = f1(zhong, hou);
console.log(root.left);
console.log(root.right);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码字的蜗牛ls

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值