二叉树的遍历方法:
二叉树的遍历主要有三种:前序遍历,中序遍历,后序遍历,层次遍历。
如二叉树:
前序遍历:
前序遍历是指按照根、左、右的规律进行访问节点。
上述二叉树前序遍历结果为: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);