树的深度与广度优先遍历
深度优先遍历:尽可能的搜索树的分支。 广度优先遍历:先访问离根节点最近的节点。
深度优先遍历
第一步:访问根节点 第二部:对根节点的children挨个进行深度优先遍历
const dfs=(root)=>{
console.log(root.val);
//递归
root.children.forEach(dfs);
};
dfs(tree);//调用
广度优先遍历
第一步:新建一个队列,把根节点入队 第二部:把队头出队并访问 第三步:把队头的children挨个入队 第四步:重复第二,三步,直到队列为空
const bfs=(root)=>{
//根节点入队
const 1=[root];
while(q.lenght>0){
//队头出队并访问
const n=q.shift();
console.log(n.val)
//把队头的children挨个入队
n.children.forEach(child=>{
q.push(child);
})
}
}
bfs(tree)
二叉树的先中后序遍历
二叉树是什么?
1.书中?每个节点?最多只能有两个子节点。 2.在JS中通常用Object来模拟二叉树。
先序遍历算法口诀
第一步:访问根节点 第二步:对根节点的?左?子树进行先序遍历。 第三步:对根节点的?右?子树进行先序遍历
//导入二叉树
const bt=require('./bt')
const preorder=(root)=>{
//如果根节点为空,直接返回
if(!root){return;}
//访问根节点
console.log(root.val)
//访问左子树
preorder(root.left)
//访问右子树
preorder(root.right)
}
中序遍历算法口诀
第一步:对根节点的?左?子树进行中序遍历 第二部:访问根节点 第三步:对根节点的?右?子树进行中序遍历。
非递归版
const inorder=(root)=>{
if(!root){return ;}
const stack=[];
let p=root;//指针
while(stack.length||p){
while(p){
stack.push(p);
p=p.left
}
const n=stack.pop();//栈顶元素出
console.log(n.val);
p=n.right;//指针指向右节点遍历
}
}
后序遍历算法口诀
第一步:对根节点的?左?子树进行后序遍历 第二步:对根节点的?右?子树进行后序遍历 第三步:访问根节点
//导入二叉树
const bt=require('./bt')
const postorder=(root)=>{
//如果根节点为空,直接返回
if(!root){return;}
//先访问左子树
postorder(root.left)
//访问右子树
postorder(root.right)
//访问根节点
console.log(root.val)
}
postorder(bt)
|