二叉树篇章之二
Posted 随性girl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树篇章之二相关的知识,希望对你有一定的参考价值。
目录
1. 前序遍历
2. 中序遍历
3. 后序遍历
4. 层序遍历
对于二叉树的遍历,主要有四种遍历方式:前序遍历、中序遍历、后序遍历、层序遍历。
下面就根据以下二叉树进行遍历:
该二叉树 的编码:
const root = {
val: "A",
left: {
val: "B",
left: {
val: "D"
},
right: {
val: "E"
}
},
right: {
val: "C",
right: {
val: "F"
}
}
};
1. 前序遍历
对于这个二叉树,前序遍历的顺序为:根节点->左子树->右子树
遍历完的结果为:A -> B -> D -> E -> C -> F
递归写法编码实现:
function preorder(root){
if(!root){
return
}
console.log(root.val) // 打印当前遍历的节点
preorder(root.left) // 递归遍历左子树
preorder(root.right) // 递归遍历右子树
}
非递归写法编码实现
实现思路:
初始化一个栈和结果数组,将根节点放入栈中,当栈不为空时,重复下面的步骤:
(1)取出栈顶元素top,访问top
(2)若top的右子节点不为空,将top的右子节点放入栈中
(3)若top的左子节点不为空,将top的左子节点放入栈中
(4)将取出的栈顶元素top放入结果数组
function preorder(root){
if(!root){
return [];
}
var result = []
var stack = [root]
while(stack.length!==0){
var top = stack.pop();
if(top.right){
stack.push(top.right);
}
if(top.left){
stack.push(top.left);
}
result.push(top.val);
}
return result;
}
2. 中序遍历
对于这个二叉树,中序遍历的顺序为:左子树->根节点->右子树
遍历完的结果为:D -> B -> E -> A -> C -> F
递归写法编码实现:
function inorder(root) {
if(!root) {
return
}
inorder(root.left) // 递归遍历左子树
console.log(root.val) // 打印当前遍历的结点
inorder(root.right) // 递归遍历右子树
}
非递归写法编码实现
实现思路:
初始化一个栈和结果数组,当栈不为空时,重复下面的步骤:
(1)将根节点和所有的左子节点放入栈中,直到没有左子节点
(2)栈顶元素出栈,存入结果数组,将出栈的元素作为根节点
(3)查看该根节点右子节点是否有左子节点,若有就入栈,否则继续出栈
function inorder(root) {
if(!root){
return [];
}
var result = []
var stack = []
while(stack.length!==0||root){
while(root){
stack.push(root);
root = root.left;
}
root = stack.pop();
result.push(root.val)
root = root.right;
}
return result;
}
3. 后序遍历
对于这个二叉树,后序遍历的顺序为:左子树->右子树->根节点
遍历完的结果为:D -> E -> B -> F -> C -> A
递归写法编码实现:
function postorder(root) {
if(!root) {
return
}
inorder(root.left) // 递归遍历左子树
inorder(root.right) // 递归遍历右子树
console.log(root.val) // 打印当前遍历的结点
}
非递归写法编码实现
实现思路:
初始化一个栈和结果数组,将根节点放入栈中,当栈不为空时,重复下面的步骤:
(1)取出栈顶元素top,访问top
(2)将取出的栈顶元素top放入结果数组的最开始
(3)若top的左子节点不为空,将top的左子节点放入栈中
(4)若top的右子节点不为空,将top的右子节点放入栈中
function postorder(root) {
if(!root){
return [];
}
var result = []
var stack = [root]
while(stack.length!==0){
var top = stack.pop();
result.unshift(top.val);
if(top.left){
stack.push(top.left);
}
if(top.right){
stack.push(top.right);
}
}
return result;
}
4. 层序遍历
层序遍历就是从上到下,从左到右打印二叉树的节点
思路:
创建一个数组存放结果,一个队列存放二叉树的节点,如果存放二叉树的队列不为空,就重复下面的步骤:
(1)将队列的第一个节点作为根节点,并放入结果数组中
(2)如果该根节点的左子树不为空,就将其放入队列中
(3)如果该根节点的右子树不为空,就将其放入队列中
编码实现
function levelTraversal(root){
if(!root){
return [];
}
var queue = [root];
var result = [];
while (tree.length!==0){
var node = queue.shift();
result.push(node.val);
if(node.left){
queue.push(node.left);
}
if(node.right){
queue.push(node.right);
}
}
return result;
}
—————————————
版权声明:本文为CSDN博主「CUG-GZ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42033567/article/details/105945016
以上是关于二叉树篇章之二的主要内容,如果未能解决你的问题,请参考以下文章