树
树的基础知识
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
var num=[3,9,20,null,null,15,7]
function preorder(node) {
if(node!=null){
console.log(node.val)
preorder(node.left)
preorder(node.right)
}
}
function inorder(node) {
if(node!=null){
inorder(node.left)
console.log(node.val)
inorder(node.left)
}
}
function postorder(node) {
if(node!=null){
postorder(node.left)
postorder(node.right)
console.log(node.val)
}
}
function levelorder(root) {//层次遍历
/***
* 思路:利用一个队列,首先将根入队列,以后若队列不空则取对头元素p,
* 如果p不空,则访问之,然后将其左右子树入队列,如此循环,知道队列为空
*
* 队列:先进先出
* 尾进:push(),头出shift()
*/
// 初始化队列
var queue=[]
var level=[0]
queue.push(root)
level.push(1)
while(queue.length>0){
var nodep=queue.shift()// 取队列头元素p
if(nodep!=null) {//若节点不为空则左右孩子入队列
// console.log(nodep.val)// 访问该节点
queue.push(nodep.left)
queue.push(nodep.right)
level.push(level[parseInt(level.length / 2)] + 1)
level.push(level[parseInt(level.length / 2)] + 1)
}
}
level.sort(function (a,b) {
return a-b
})
return level.pop()-1
}
function dfsorder(root) { //DFS深度优先遍历
if(root==null){
return 0
}else{
var leftheight=arguments.callee(root.left)
var rightheight=arguments.callee(root.right)
return Math.max(leftheight,rightheight)+1
}
}
function BSTorder(root){
/***
* 搜索树的特点:
* 1. 采用中序遍历则是从大到小排列
*/
if(root!=null){
BSTorder(root.left)
console.log(root.val)
BSTorder(root.right)
}
}
树的相关题目
简单题
- 938二叉搜索树的范围和
var inorder=function(node,arr){
if(node!=null){
arguments.callee(node.left,arr)
arr.push(node.val)
arguments.callee(node.right,arr)
}
}
var rangeSumBST = function(root, L, R) {
/**
* 二叉搜索树的特点:中序遍历后的结果为顺序排列,所以这道题时中序遍历后从L加到R
* 所以要返回一个中序遍历的结果
*/
var arr=[],rss=0
inorder(root,arr)
index1=arr.indexOf(L)
index2=arr.indexOf(R)
rss=arr.slice(index1,index2+1)
return rss.reduce((befor,cur)=>befor+cur)
}
- 617合并二叉树
var mergeTrees = function(t1, t2) {
if(t1==null){
return t2
}
if(t2==null){
return t1
}
t1.val+=t2.val
t1.left=arguments.callee(t1.left,t2.left)
t1.right=arguments.callee(t1.right,t2.right)
return t1
};
- 700 二叉搜索树中的搜索
var searchBST = function(root, val) {
/**
* 分析
* 前序遍历到该节点,然后返回该节点
* 写成前序遍历的是错的
*/
if(root==null){return null}
if(root!=null){
if(root.val===val){
return root
}else if(root.val>val){
return arguments.callee(root.left,val)
}else{
return arguments.callee(root.right,val)
}
}
};