二叉树的遍历

二叉树的遍历方法:

​ 二叉树的遍历主要有三种:前序遍历,中序遍历,后序遍历,层次遍历。

​ 如二叉树:

在这里插入图片描述

前序遍历:

​ 前序遍历是指按照根、左、右的规律进行访问节点。

​ 上述二叉树前序遍历结果为:1 2 4 5 3

中序遍历:

​ 中序遍历是指按照左、根、右的方式进行访问节点。

​ 上述二叉树中序遍历结果为:4 2 5 1 3

后序遍历:

​ 后序遍历是指按照左、右、根的方式进行访问节点。

​ 上述二叉树后序遍历结果为:4 5 2 3 1

层次遍历:

​ 层次遍历是指一层一层地遍历,该层遍历完才会去访问下一层。

​ 上述二叉树层次遍历结果为:1 2 3 4 5

如何确定一棵二叉树?

​ 确定一棵二叉树是根据二叉树的前序、中序、后序遍历方式结合进行的。

​ 首先需要知道二叉树左右子树是分顺序的,顺序不同则为不同的二叉树,如果把一个二叉树按节点分为几个小的只有三个节点(根,左子树,右子树,左右子树均为叶子)的二叉树,那么就需要知道每个小二叉树的根和左右子树,很容易看出中序遍历的结果中,如果有一个节点不为叶子,即它有左右子树的时候,则该节点的左右边分别对应着它的左右子树,因此中序遍历可以用来确定左右子树

​ 确定左右子树的话,需要知道是谁的左右子树,即需要找根,先看前序遍历,前序遍历结果的第一个数一定为根,在中序遍历中找到这个根,他的左右两边即为左右子树,把左右子树分别看为一个小的二叉树,重复以上操作,就能确定一条唯一的二叉树。

​ 再看后序遍历,后序遍历的结果最后一个数一定为根,然后就和前序遍历+中序遍历的核心一样了,只是需要对后序遍历的结果从后往前看。

​ 下面是用JS写的根据前序+中序遍历创建二叉树并返回根节点的算法

知识储备:

​ Array shift(): 删除数组的第一个值,并返回删除的元素

​ Array indexOf(): 返回数组中某个指定元素的位置

​ Array slice(start, end): 从数组中返回下标选定范围的元素,start包含,end不包含

function TreeNode(val){//模拟数的结构
        this.val = val
        this.left = this.right = null
        }
function buildTree(preorder, inorder){
        //递归,前序第一个元素,将中序分为左右子树
        //取出前序第一个元素作为根节点
        if(preorder.length <=0) return null
        let rootVal = preorder.shift()//取前序遍历的第一个节点,是根节点
        let node = new TreeNode(rootVal)//创建这个根节点的左右子树
        let index = inorder.indexOf(rootVal)//在中序遍历中找到这个节点的位置
        let leftInorder = inorder.slice(0, index)//这是该根节点的左子树
        let rightInorder = inorder.slice(index+1)//这是该根节点的右右子树
        node.left = buildTree(preorder.slice(0, index), leftInorder)//以当前节点为依据,前边的作为下一次递归的前序遍历(shift()方法已删除原本的第一个元素,原本的第二个作为下一次递归的第一个节点;中序遍历的左边作为下一次递归的中序遍历
        node.right = buildTree(preorder.slice(index), rightInorder)
        return node//返回节点值
		}
let pre = [3,9,20,15,7]
let inO = [9,3,15,20,7]
var tree = buildTree(pre, inO)
console.log(tree);
最终结果:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值