[LeetCode_94] Binary Tree Inorder Traversal
###题目链接
https://leetcode.com/problems/binary-tree-inorder-traversal/
###题意
二叉树的中序遍历
###代码(递归,C++)
其中函数返回类型不符合题目中要求,做相应更改即可A;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderVec;
void inorderTraversal(TreeNode* root) {
if(root==NULL){
return;
}
if(root->left){
inorderTraversal(root->left);
}
inorderVec.push_back(root->val);
if(root->right){
inorderTraversal(root->right);
}
}
};
###相关
####二叉树的中序遍历非递归版
#####思路:
- 当栈不为空或当前节点不为空:一路将左孩子压入栈直到当前节点为空,然后弹出栈顶元素并将它加入输出队列,将当前节点更新为其右孩子;再继续一路向左...
#####代码(Java)
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
if (root == null) {
return list;
}
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) { //
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
list.add(cur.val);
cur = cur.right;//
}
return list;
}
}
####二叉树的先序遍历非递归版
#####思路:
- 使用栈。
- 具体的,
- 先把根节点压栈。
- while(栈非空){栈顶元素弹出并打印,若其右孩子非空则入栈,若其左孩子非空则压栈}
#####代码(Java)
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> l=new ArrayList<>();
Stack<TreeNode> s=new Stack<>();
if(root==null) {
return l;
}
s.add(root);
while(!s.empty()) {
TreeNode node=s.pop();
l.add(node.val);
if(node.right!=null) {
s.push(node.right);
}
if(node.left!=null) {
s.push(node.left);
}
}
return l;
}
}
####二叉树的后序遍历非递归版
#####思路:
- 变量dealedNode代表最近一个加入到输出队列的节点,stacktopNode记录当前栈顶节点。
- 因为后序遍历要三次到达每个节点,在第三次才输出当前节点,所以根据栈顶元素的左孩子和右孩子是否刚处理完是否为空,分三种情况做下一步操作。
- 具体的,每次循环更新栈顶元素变量。
- 一 若上一个处理完的节点不是栈顶元素的左孩子也不是当前栈顶元素的右孩子,说明是第一次到达该节点,若栈顶元素左孩子不为空则压入左孩子
- 二 若不符合上一条,且上一个处理完的节点不是栈顶元素的右孩子(等价于 上一个处理完的是栈顶元素的左孩子或栈顶元素的左孩子为null),则说明是第二次到达该节点,若栈顶元素右孩子不为空则压入右孩子。
- 三 若不符合上两条,说明是第三次到达该节点,将该节点弹出,处理该节点(及将该节点加入输出队列),更新dealedNode变量。
- 终止条件:栈为空
#####代码(Java)
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> l=new ArrayList<>();
Stack<TreeNode> s=new Stack<>();
if(root==null) {
return l;
}
TreeNode dealedNode=root;
s.add(root);
TreeNode stackTopNode;
while(!s.empty()) {
stackTopNode=s.peek();
if(dealedNode!=stackTopNode.left&&dealedNode!=stackTopNode.right&&stackTopNode.left!=null) {
s.add(stackTopNode.left);
}
else if(dealedNode!=stackTopNode.right&&stackTopNode.right!=null) {
s.add(stackTopNode.right);
}
else {
s.pop();
l.add(stackTopNode.val);
dealedNode=stackTopNode;
}
}
return l;
}
}
####二叉树的层序遍历
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> l=new ArrayList<>();
LinkedList<TreeNode> q=new LinkedList<>();
if(root!=null) {
q.add(root);
while(!q.isEmpty()) {
TreeNode temproot=q.poll();
l.add(temproot.val);
if(temproot.left!=null) {
q.add(temproot.left);
}
if(temproot.right!=null) {
q.add(temproot.right);
}
}
}
return l;
}
}
[LeetCode_94] Binary Tree Inorder Traversal的更多相关文章
- LintCode Binary Tree Inorder Traversal
Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...
- 37. Binary Tree Zigzag Level Order Traversal && Binary Tree Inorder Traversal
Binary Tree Zigzag Level Order Traversal Given a binary tree, return the zigzag level order traversa ...
- 3月3日(4) Binary Tree Inorder Traversal
原题: Binary Tree Inorder Traversal 和 3月3日(2) Binary Tree Preorder Traversal 类似,只不过变成中序遍历,把前序遍历的代码拿出来, ...
- 49. leetcode 94. Binary Tree Inorder Traversal
94. Binary Tree Inorder Traversal 二叉树的中序遍历 递归方法: 非递归:要借助栈,可以利用C++的stack
- LeetCode: Binary Tree Inorder Traversal 解题报告
Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...
- [leetcode] 94. Binary Tree Inorder Traversal 二叉树的中序遍历
题目大意 https://leetcode.com/problems/binary-tree-inorder-traversal/description/ 94. Binary Tree Inorde ...
- [线索二叉树] [LeetCode] 不需要栈或者别的辅助空间,完成二叉树的中序遍历。题:Recover Binary Search Tree,Binary Tree Inorder Traversal
既上篇关于二叉搜索树的文章后,这篇文章介绍一种针对二叉树的新的中序遍历方式,它的特点是不需要递归或者使用栈,而是纯粹使用循环的方式,完成中序遍历. 线索二叉树介绍 首先我们引入“线索二叉树”的概念: ...
- 【LeetCode】94. Binary Tree Inorder Traversal (3 solutions)
Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values ...
- 二叉树前序、中序、后序非递归遍历 144. Binary Tree Preorder Traversal 、 94. Binary Tree Inorder Traversal 、145. Binary Tree Postorder Traversal 、173. Binary Search Tree Iterator
144. Binary Tree Preorder Traversal 前序的非递归遍历:用堆来实现 如果把这个代码改成先向堆存储左节点再存储右节点,就变成了每一行从右向左打印 如果用队列替代堆,并且 ...
随机推荐
- CSS中clear属性的both、left和right浅析
前端开发中,我们知道clear属性有none.both.left和right四个值. 它们的具体含义如下: none:允许两边都可以有浮动对象: both:不允许有浮动对象; left:不允许左边有浮 ...
- Linux下使用命令行配置IPMI
ipmitool是什么: 百度百科给的解释已经够用了,简单说就是“IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理具备“智能 ...
- ReactiveX 学习笔记(8)错误处理和 To 操作符
Error Handling Operators Operators to Convert Observables 本文的主题为对 Observable 进行错误处理的操作符以及转换 Observab ...
- Linux通配符与基础正则表达式、扩展正则表达式
在Linux命令行操作或者SHELL编程中总是容易混淆一些特殊字符的使用,比如元字符‘*’号,作为通配符匹配文件名时表示0个到无穷多个任意字符.而作为正则表达式匹配字符串时,表示重复0个到无穷多个的前 ...
- TCP工作过程;TCP Flood的攻击的原理和现象;TCP协议设计的安全隐患与防范对策
TCP分三个阶段 连接建立(三次握手) 数据传输 连接释放(四次挥手) TCP工作过程 TCP连接建立阶段 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给S ...
- Delphi中For In 语法应用实例
一.遍历 TStrings var List: TStrings; s: string; begin List := TStringList.Create; List.CommaText := 'aa ...
- 吴裕雄 python oracle子查询的用法(3)
import cx_Oracle conn = cx_Oracle.connect("scott/admin@localhost:1521/orcl")cursor = conn. ...
- python3.6安装-windows
1.打开python官网 2.找到下载链接 3.选择对应的版本下载 4.下载完成后打开安装包并执行,运行出该界面. 5.这里是安装到C盘上(默认安装) 6.此处为自定义安装 7.选择自定义安装,并全选 ...
- java 代理学习
转自黄勇大神的博客.http://my.oschina.net/huangyong/blog/159788 Proxy,也就是“代理”了.意思就是,你不用去做,别人代替你去处理. 它在程序开发中起到了 ...
- Python基础学习Day2
一.格式化输出 需求格式化输出:姓名.年龄.工作.爱好 # 格式化输出 name = input('请输入用户名:') age = input('请输入年龄:') job = input('请输入你的 ...