二叉树篇章之二

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




以上是关于二叉树篇章之二的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之树与二叉树

Nginx数据结构之红黑树ngx_rbtree_t

SDUT 3345 数据结构实验之二叉树六:哈夫曼编码

二叉树二叉搜索树

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 11 二叉树

Java 数据结构 & 算法宁可累死自己, 也要卷死别人 11 二叉树