题目:Binary Tree Inorder Traversal(二叉树中序遍历)
Given a binary tree, return the inorder traversal of its nodes' values.
给定一个二叉树,返回它的 中序 遍历。
Example:
Input:[1,null,2,3]1\2/3Output:[1,3,2]
Follow up:Recursive solution is trivial, could you do it iteratively?
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
solve:
▉ 问题分析
2)通常递归的方法解决二叉树的遍历最方便不过,但是我还是喜欢增加点难度,用一般的迭代循环来实现。
▉ 算法思路
递归法:
1)判断当前树是否为空。
2)递归树的左子树结点。
3)输出当前结点的值。
4)递归树的右子树节点。
迭代循环法:
1)声明一个栈,将树的左子节点入栈。
2)每出栈一个结点,输出当前结点的值,且将该结点的右子树进行遍历打印,保证每个出栈的结点输出值之后,再输出上一个左子节点之前,将当前结点的右子节点遍历毕。
3)整棵树遍历完毕的终止条件就是当前栈是否存在结点(树的左子节点)。
▉ 递归实现
varinorderTraversal =function(root){letarr = []constinorder =root=>{// 判断当前的结点是否为空if(root ==null)returnnull;// 递归左子树inorder(root.left)// 输出结点值arr.push(root.val)// 递归右子树inorder(root.right) } inorder(root)returnarr};
▉ 迭代实现
// 迭代实现二叉树的中序遍历varinorderTraversal =function(root){letstack = [];letresult = [];while(true){// 判断树是否为空if(root ==null)returnresult;// 先将树的左子节点推入栈中while(root !==null){ stack.push(root); root = root.left; }// 遍历的终止条件if(stack.length !==0){// 输出栈中的结点lettemp = stack.pop(); result.push(temp.val);// 如果当前存在右子节点,要先打印右子树节点root = temp.right; }else{break; } }returnresult;}
进群:697699179可以获取Java各类入门学习资料!
这是我的微信公众号【编程study】各位大佬有空可以关注下,每天更新Java学习方法,感谢!
学习中遇到问题有不明白的地方,推荐加小编Java学习群:697699179内有视频教程 ,直播课程 ,等学习资料,期待你的加入