首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Javascript -按顺序遍历二叉树。最后一个值打印未定义

在JavaScript中,按顺序遍历二叉树并打印最后一个值未定义可能是由于以下几种情况导致的:

  1. 二叉树为空:如果二叉树为空,即没有任何节点,那么最后一个值将是未定义。在这种情况下,可以直接返回或者输出一个错误消息。
  2. 遍历算法错误:按顺序遍历二叉树的算法可能存在错误,导致最后一个值未定义。在这种情况下,需要检查遍历算法的实现,确保正确地遍历了二叉树的每个节点。

以下是一个示例的JavaScript代码,用于按顺序遍历二叉树并打印最后一个值:

代码语言:javascript
复制
// 定义二叉树节点
class Node {
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
}

// 按顺序遍历二叉树并打印最后一个值
function traverseBinaryTree(root) {
  let stack = [];
  let current = root;
  let lastVisited = null;

  while (current || stack.length > 0) {
    if (current) {
      stack.push(current);
      current = current.left;
    } else {
      let node = stack.pop();
      // 记录最后一个访问的节点
      lastVisited = node.value;
      current = node.right;
    }
  }

  if (lastVisited === null) {
    console.log("二叉树为空");
  } else {
    console.log("最后一个值: " + lastVisited);
  }
}

// 创建二叉树
let root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
root.right.left = new Node(6);
root.right.right = new Node(7);

// 按顺序遍历二叉树并打印最后一个值
traverseBinaryTree(root);

在上述代码中,我们使用了一个栈来辅助遍历二叉树。首先将根节点入栈,然后循环执行以下操作:

  • 如果当前节点存在左子节点,将左子节点入栈,并将当前节点更新为左子节点。
  • 如果当前节点不存在左子节点,弹出栈顶节点,记录最后一个访问的节点的值,并将当前节点更新为右子节点。
  • 当栈为空且当前节点为空时,遍历结束。

最后,根据最后一个访问的节点的值是否为null,输出相应的结果。

这是一个简单的按顺序遍历二叉树的示例代码,你可以根据实际情况进行修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

讲透学烂二叉树(三):二叉树遍历图解算法步骤及JS代码

先序遍历结果:ABDHIEJCFKG 二叉树先序遍历-js代码实现 递归实现—二叉树先序遍历 根 - 左 - 右递归 判断根结点是否为空,为空则返回null;否则取结点的,然后去左、右结点的...node) {         return backs     }     let queue = [node]     while (queue.length) {         // 取出最后一个结点...(LDR) 中序遍历可以想象成,树画好的左右位置投影下来就可以了 下面看下投影的过程动画,其实就是左右顺序写下来就行了 中序遍历结果:HDIBEJAFKCG 二叉树中序遍历-JavaScript代码实现...跟之前先序遍历绕圈的路线是一样的(先序遍历,是遇到结点,就push到数组),但是后续遍历是:递归:先取左叶结点(没有就跳过),再取右叶子结点 后序遍历结果:HIDJEBKFGCA 二叉树后续遍历-JavaScript...其实我们在用递归算法实现二叉树遍历的时候,不管是先序中序还是后序,程序都是按照上面那个顺序跑遍所有结点的。

80011

前端工程师leetcode算法面试必备-二叉树深度广度遍历1

接下来,通过具体的题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树中的应用。二、102. 二叉树的层次遍历给定一个二叉树,返回其层次遍历的节点。(即逐层地,从左到右访问所有节点)。...二叉树的后序遍历给定一个二叉树,返回它的 后序 遍历。  ...这里我们利用栈后进先出的特性,将右子树最后推进栈,使得右子树先进行深度搜索:图片四、987. 二叉树的垂序遍历给定二叉树垂序遍历返回其结点。...把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们从上到下的顺序报告结点的( Y 坐标递减)。...如果两个结点位置相同,则首先报告的结点较小。 X 坐标顺序返回非空报告的列表。每个报告都有一个结点列表。  最后,通过本道题目来开启 Medium 难度题型的讲解。

40320

前端工程师leetcode算法面试之二叉树深度广度遍历

接下来,通过具体的题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树中的应用。二、102. 二叉树的层次遍历给定一个二叉树,返回其层次遍历的节点。(即逐层地,从左到右访问所有节点)。...二叉树的后序遍历给定一个二叉树,返回它的 后序 遍历。  ...这里我们利用栈后进先出的特性,将右子树最后推进栈,使得右子树先进行深度搜索:图片四、987. 二叉树的垂序遍历给定二叉树垂序遍历返回其结点。...把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们从上到下的顺序报告结点的( Y 坐标递减)。...如果两个结点位置相同,则首先报告的结点较小。 X 坐标顺序返回非空报告的列表。每个报告都有一个结点列表。  最后,通过本道题目来开启 Medium 难度题型的讲解。

29940

前端工程师leetcode算法面试必备-二叉树深度广度遍历

接下来,通过具体的题目解析,带大家了解 DFS 和 BFS 搜索思想在二叉树中的应用。 二、102. 二叉树的层次遍历 给定一个二叉树,返回其层次遍历的节点。(即逐层地,从左到右访问所有节点)。...二叉树的后序遍历 给定一个二叉树,返回它的 后序 遍历。   ...这里我们利用栈后进先出的特性,将右子树最后推进栈,使得右子树先进行深度搜索: 图片 四、987. 二叉树的垂序遍历 给定二叉树垂序遍历返回其结点。...把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们从上到下的顺序报告结点的( Y 坐标递减)。...如果两个结点位置相同,则首先报告的结点较小。 X 坐标顺序返回非空报告的列表。每个报告都有一个结点列表。   最后,通过本道题目来开启 Medium 难度题型的讲解。

35120

精读《算法 - 二叉树

所谓前中后,就是访问节点在什么时机,其余时机先左后右访问子节点。比如前序遍历,就是先访问,再访问左右;后续遍历就是先访问左右,再访问;中序遍历就是左,,右。...从上到下打印二叉树 从上到下打印二叉树是一道简单题,题目如下: 从上到下打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。...当然如果题目要求倒序打印,你就可以以 右、中、左 的顺序进行处理。 接下来看看深度优先遍历,典型题目是二叉树的深度。...右侧的光束可以认为是分层照射的,那么当我们用广度优先算法遍历时,对于每一层,都找到最后一个节点打印,并且顺序打印就是最终答案。...有一道二叉树的题目,是根据树的深度,按照广度优先遍历打印成二维数组,记录树的深度其实也有巧妙办法,即在栈尾追加元素时,增加一个深度 key,那么访问时自然就可以读到深度

28110

今天,带你学会二叉树打印

首先是第一道,从上到下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印,比如给定二叉树 [3,9,20,null,null,15,7]。 ? 返回 [3,9,20,15,7]。...(root); // 遍历队列,直到队列为空,说明访问了二叉树中所有的节点 while(!...:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。...输出变成了: [ [3], [20,9], [15,7] ] 翻译过来的意思就是,奇数层顺序打印,偶数层逆序打印,实现思路上可以通过设置一个标志位 isOddNumber 用来判断当前的层数是否为奇数层...: 如果是奇数层,那么顺序把 queue 中的元素添加到双端队列 temp 的尾部 如果是偶数层,那么顺序把 queue 中的元素添加到双端队列 temp 的头部 解题过程如下: ?

1.1K60

非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?

只要满足这两点,它就是一个堆。 堆是一个完全二叉树。完全二叉树:除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。 堆中每一个节点的都必须大于等于(或小于等于)其子树中每个节点的。...完全二叉树用数组来存储是最省内存的方式。 顺序存储 二叉树遍历 经典的方法有三种:前序遍历、中序遍历、后序遍历。其中,前、中、后序,表示的是节点与它的左右子树节点遍历访问的先后顺序。...后序遍历(左 => 右 => 根) 对于树中的任意节点来说,先访问它的左子树,然后再访问它的右子树,最后访问它本身。 实际上,二叉树的前、中、后序遍历就是一个递归的过程。...preOrderTraverseNode(node.right, callback); // 最后遍历右子节点 } }; 用先序遍历遍历下图所示的树,并打印节点键值。...对下图的树进行后序遍历,并打印键值:3 6 5 8 10 9 7 12 14 13 18 25 20 15 11。遍历过程如图: 添加打印的方法 print。

78730

数据结构与算法 -二叉树遍历

先序遍历DLR ,首先访问根结点,其次遍历根的左子树,最后遍历根右子树,对每棵子树同样 这三步(先根、后左、再右)进行。...后序遍历LRD,首先遍历根的左子树,其次遍历根的右子树,最后访问根结点,对每棵子树同样 这三步(先左、后右、最后根)进行。...遍历 二叉树的层次遍历是从二叉树的根结点的这一层开始,逐层向下 遍历,在每一层上从左到右的顺序对结点逐个访问。 上图层次遍历,所得到的 的结点序列为:ABCDEFGH。...设二叉树的二叉链表的根指针为bt,编写一算法,打印出一棵二叉树中所有结点的,并统计结点的个数。...设二叉树的二叉链表的根指针为bt,每个结点的数据域中存放一个整数,编写一算法,求此二叉树上数据域的为8的结点个数。

54330

【数据结构】二叉树

二叉树的前序遍历 二叉树的前序遍历是先访问根节点,再访问左子树,最后访问右子树,即按照根 - 左子树 - 右子树的顺序遍历;示例代码: //前序遍历 void PrevOrder(BTNode*...,再将当前根的左子树进行递归,最后对右子树递归,结束条件为空,即完成了 根 - 左子树 - 右子树 的顺序访问,若以上面我们创建的二叉树为例,如图为运行结果,假设 N 为空: 遍历的过程我们可以分解为如下...二叉树的中序遍历 二叉树的中序遍历,与前序的区别是,中序遍历先访问左子树,再访问根,最后访问右子树,即按照左子树 - 根 - 右子树的顺序遍历;示例代码: //中序遍历 void InOrder...二叉树的后序遍历 二叉树的后序遍历,与前序和中序相似,后序是先访问左子树,再访问右子树,最后访问根;按照左子树 - 右子树 - 根的顺序遍历;示例代码: //后序遍历 void PostOrder...如图顺序遍历为层序遍历: 层序遍历的思路是用队列实现,每打印一个根的数据,就将这个根的左节点和右节点入队,如下图,使用上面我们创建的二叉树,再创建一个队列 q ,队列中存的是每个树的节点:

7210

JS - 二叉树算法实现与遍历 (更新中...)

37 })  四、二叉树遍历   中序遍历     顺序(左中右):先访问当前节点的左子树直到左子树为空,再打印当前最后访问当前节点的右子树     作用:用于排序一个数组,从小到大升序排列。   ...前序遍历     顺序(中左右):先访问并打印当前节点的,然后访问当前节点的左子树,最后访问当前节点的右子树     作用:复制一个已有的二叉树结构,性能是最高的。...后序遍历     顺序(左右中):先访问当前节点的左子树,然后访问当前节点的右子树,最后访问并打印当前节点     作用:用于操作系统和文件系统的遍历上。...用前序遍历复制的二叉树,效率要比重新构造一个二叉树高得多"> 9 10 11 前序遍历的特点就是遍历次序的不一样,先打印当前节点,然后访问当前节点的左子树...,再然后打印当前节点的右子树 12 用前序遍历拷贝一个二叉树,只需要依次遍历所有的子节点就好了。

3.5K80

数据结构——遍历二叉树

访问其实是要根据实际的需要来确定具体做什么,比如对每个结点进行相关计算,输出打印等。它算作是一个抽象操作。 二叉树遍历次序不同于线性结构,最多也就是从头到尾、循环和双向等简单的遍历方式。...2、中序遍历二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点左子树,然后访问根结点,最后中序遍历右子树,如下图遍历顺序为:GDHBAEICF。 ?...3、后序遍历二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点,如下图遍历顺序为:GHDBIEFCA。 ?...4、层序遍历二叉树为空,则空操作返回,否则从树的第一层开始,也就是从根结点开始访问,从上而下逐层遍历,在同一层中,从左到右的顺序对结点逐个访问,如下图遍历顺序为:ABCDEFGHI。 ?...三种遍历都是从根结点开始,前序遍历是先打印再递归左和右,所有前序遍历序列为ABCDEF,第一个字母A就是根结点;再由中序遍历序列CBAEDF,可以只带C和B是A的左子树上的结点,E、D、F是A的右子树上的结点

42510

66道前端算法面试题附思路分析助你查漏补缺

当压栈顺序遍历完成后,如果辅助栈不为空,则说明该出栈顺序不正确。 22. 从上往下打印二叉树 题目: 从上往下打印二叉树的每个节点,同层节点从左至右打印。...之字形顺序打印二叉树(待深入理解) 题目: 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照 从左到右的顺序打印,第二层按照从右到左顺序打印...思路: 之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。...详细资料可以参考: 《之字形顺序打印二叉树》 60. 从上到下打印二叉树,同一层结点从左至右输出。每一层输出一行。...题目: 从上到下打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行。 思路: 用一个队列来保存将要打印的结点。

1.6K20

【剑指Offer】1-10题

1 二维数组中的查找 1.1 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。...1.2 解题思路 行开始遍历,假设target大于第一行的最后一个数,那么我们就在第二行查找;如果target小于一行的最后一个数,那么我们检查下倒数第二列是否等于target。...3.1 题目描述 输入一个链表,链表从尾到头的顺序返回一个ArrayList。...3.2 解题思路 遍历列表,每次遍历一个节点,然后将当前节点的添加到列表,然后更新节点为下一个节点,最后将列表反转。...4.1 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树

60920

怒肝 JavaScript 数据结构 — 树的遍历

上一篇我们介绍了树的概念,什么是二叉树与二叉搜索树,并实现了一个二叉搜索树的类,然后完成了节点插入的功能。 如果你还不清楚树是什么,请看上一篇:怒肝 JavaScript 数据结构 — 树与二叉树。...也就是说元素都在一条线上,我们从第一个元素开始,一个一个向后遍历即可找到所有元素。 但是树的遍历不是一维的,它有很多分叉,因此遍历起来会复杂一些。...,先序遍历是先访问节点本身,然后是左侧节点,最后是右侧节点,因此是 中-左-右 的执行顺序。...先序遍历,中序遍历,后序遍历,这里的“先,中,后” 其实指的都是 根节点 的位置,两边的规则都是先左后右。 查找某个 前面介绍了三种遍历方式,有了遍历,我们就能暴力查找任何一个。...这是学习 JavaScript 数据结构与算法的第 23 篇,本系列会连续更新一个月。

44630

《剑指 Offer(第 2 版)》树部分JavaScript题解

从上到下打印二叉树 II 从上到下打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。...从上到下打印二叉树 III 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。...」 每层都三个参数,一个是当前结点,一个是 target 剩余值,一个是总路径数组 当往二叉树深处进行遍历时,如果 target 剩余值跟结点相等且左右子树为空(叶子结点),则满足要求,往 result...链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 下图展示了上面的二叉搜索树转化成的链表。...从上到下打印二叉树 从上到下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印

35130

数据结构:树与二叉树

image.png 利用指针域我们便可以完美的存储非完全二叉树,如下: image.png 在含有n个结点的二叉树链表中含有n+1个空链域 二叉树遍历 所谓二叉树遍历是指某条搜索路径访问树中的每个结点...并令其lchild域指向二叉树的根节点,其rchild域指针指向中序遍历时访问的最后一个结点;反之,令二叉树中序遍历中的第一个节点的lchild域的指针和最后一个结点的rchild域的指针均指向头结点,...这好比为二叉树建立一个双向线索链表,既可以从第一个结点起顺后继进行遍历,也可以从最后一个结点起顺前驱进行遍历。...先序遍历:若树非空,则先访问根结点,再按从左到右的顺序遍历根节点的每一颗子树。其访问顺序与这颗树相应二叉树的现需遍历顺序相同。...后序遍历:若树非空,则按从左到右的顺序遍历根节点的每一颗子树,之后再访问根节点。其访问顺序与这棵树相应二叉树的中序遍历顺序相同。

1K31

PAT 1020 Tree Traversals (25分) 解读

题目只是让我输出最后遍历结果,又不是让我得到一棵树,我只需要巧妙的调整一下代码就能利用一个map得到层序遍历的结果(柳婼大神nb) 但不管怎么样,都得先解决一个问题,就是利用中序序列和后序序列怎么得到二叉树呢...最后就可以还原一棵树了。该步递归的过程可以简洁表达如下: 1 确定根,确定左子树,确定右子树。 2 在左子树中递归。 3 在右子树中递归。 4 返回或者打印当前根。...层序遍历 那我们一般是怎么是层序遍历,宽度优先遍历,层序其实也就是顺序,一般都是用一个队列,队列中保存的始终是一整层的姐弟啊,对于每层每个节点,访问自己,把左右孩子加入队列,==【保证了访问的先后顺序...因为键值的大小关系,map会自动顺序排序,相当于保证了访问的先后顺序,这样我们最后直接顺序输出整个map的,就实现了队列的功能。...> postorder, inorder; // 层序遍历 map level_order; // 因为层序其实也就是顺序,一般都是用一个队列,对于每层节点,访问自己,把左右孩子加入队列

48030

数据结构与算法:链式二叉树

如果用N来代表空,我们可以表示出访问顺序: 1 2 3 N N N 4 5 N N 6 N N 接下来讨论中序遍历 在中序遍历中,我们首先遍历左子树,然后访问根节点,最后遍历右子树 遍历顺序: 首先访问左子树...这种遍历方式可以保证二叉树中每个节点的访问顺序正好对应其在树中的层次和位置。层序遍历通常借助于队列这一数据结构来实现。...:3, 5, 6 取出3,打印3,队列状态:5, 6 取出5,打印5,队列状态:6 取出6,打印6,队列空 打印顺序:1, 2, 4, 3, 5, 6。...7.判断是否为完全二叉树 判断一棵树是否为完全二叉树,可以利用层序遍历的思想。完全二叉树的特点是,除了最后一层外,每一层都是完全填满的,且最后一层的所有节点都集中在左侧。...这是因为在完全二叉树中,一旦层序遍历遇到空节点,其后的所有节点也应该是空的。 如果 front 非空,将其左右子节点(即使是空的)添加到队列中。这样做是为了保证即使是空节点也按照层序顺序排列。

6910
领券