给出一棵二叉树,返回这棵树的中序遍历
例如:
给出的二叉树为{1,#,2,3},
1\2/3
返回[1,3,2].
备注:递归的解法太没有新意了,你能用迭代的方法来解这道题吗?
/* * 非递归实现二叉树的中序遍历 */ public ArrayList<Integer> inorderTraversal(TreeNode root) { Stack<TreeNode> stack = new Stack<TreeNode>(); ArrayList<Integer> res = new ArrayList<Integer>(); TreeNode node = root; while (!stack.isEmpty() || node != null) { while (node != null) { stack.push(node); node = node.left; } node = stack.pop(); res.add(node.val); node = node.right; } return res; }
class Solution { public: vector<int> inorderTraversal(TreeNode *root) { vector<int> result; if(!root) return result; stack<TreeNode*> s; TreeNode *p=root; while(!s.empty() || p!=NULL) { while(p) { s.push(p); p=p->left; } if(!s.empty()) { p = s.top(); s.pop(); result.push_back(p->val); p = p->right; } } return result; } };
//中序遍历递归算法 import java.util.*; public class Solution { ArrayList<Integer> res=new ArrayList<Integer>(); public ArrayList<Integer> inorderTraversal(TreeNode root) { if(root==null) return res; inorder(root,res); return res; } public void inorder(TreeNode root,ArrayList<Integer> res){ if(root!=null){ inorder(root.left,res); res.add(root.val); inorder(root.right,res); } } } //中序遍历非递归算法 import java.util.*; public class Solution { ArrayList<Integer> res=new ArrayList<Integer>(); public ArrayList<Integer> inorderTraversal(TreeNode root) { if(root==null) return res; inorder(root,res); return res; } public void inorder(TreeNode root,ArrayList<Integer> res){ Stack<TreeNode> stack=new Stack<>(); TreeNode node=root; while(node!=null||!stack.isEmpty()){ if(node!=null){ stack.push(node); node=node.left; } else{ node=stack.pop(); res.add(node.val); node=node.right; } } } }
class Solution { public: vector<int> inorderTraversal(TreeNode *root) { stack<TreeNode*> st; vector<int> res; if(root==nullptr) return res; TreeNode *cur=nullptr; st.push(root); while(!st.empty()){ cur=st.top(); if(cur->left==nullptr&&cur->right==nullptr){ res.push_back(cur->val); st.pop(); } if(cur->right){ st.pop(); st.push(cur->right); st.push(cur); cur->right=nullptr; } if(cur->left){ st.push(cur->left); cur->left=nullptr; } } return res; } };
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ import java.util.*; public class Solution { public ArrayList<Integer> inorderTraversal(TreeNode root) { if(root==null) { return new ArrayList<>(); } ArrayList<Integer> list=new ArrayList<>(); list.addAll(inorderTraversal(root.left)); list.add(root.val); list.addAll(inorderTraversal(root.right)); return list; } }
class Solution: def inorderTraversal(self , root ): # write code here res = [] if not root: return res stk = [root] visited_left = set() # set用来记录谁往左遍历过,下次就不遍历了 while stk: tmp_cur = stk[-1] #每次拿最上面的点 i = len(stk) - 1 # 开始遍历找到不能再往左的点,同时压栈 while tmp_cur not in visited_left and tmp_cur.left: visited_left.add(tmp_cur) # 往左走过就记住,下次不会了 stk.append(tmp_cur.left) tmp_cur = tmp_cur.left i += 1 # 中序输出 res.append(tmp_cur.val) # 没有左边的点,就往右走一个 if tmp_cur.right: stk.append(tmp_cur.right) tmp_cur = tmp_cur.right # 左右都走过的点出栈 stk.pop(i) return res
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<Integer> inorderTraversal(TreeNode root) { //一眼就看出来是DFS中序啦,Tree就是这样,麻烦是麻烦,套路比较固定 /*方法一: 递归(这里用List)时间复杂度:O(n);空间复杂度:最坏情况下需要空间O(n),平均情况为O(logn)。*/ List< Integer > ans = new ArrayList<>(); helper(root, ans); return ans; } public void helper (TreeNode node, List < Integer > ans){ if(node != null){ if(node.left != null){ helper(node.left, ans); } ans.add(node.val); if(node.right != null){ helper(node.right, ans); } } } }
class Solution { public ArrayList<Integer> inorderTraversal(TreeNode root) { //一眼就看出来是DFS中序啦,Tree就是这样,麻烦是麻烦,套路比较固定 /*方法2:迭代 */ ArrayList < Integer > ans = new ArrayList < > (); Stack < TreeNode > stack = new Stack < > (); //这里用栈实现 TreeNode curr = root ; while(curr != null || !stack.isEmpty()){ while(curr != null){ stack.push(curr); curr = curr.left;//左 } curr = stack.pop(); ans.add(curr.val);//中 curr=curr.right;//右 } return ans; } }
/* * 目的:二叉树中序遍历 * 方法1:递归 * 方法2:用栈模拟递归过程 * 方法3:morris中序遍历,不需要额外空间,以时间换空间 */ //方法一: void inorder(TreeNode*root, vector<int>&res){ if (root == nullptr) return ; inorder(root->left, res); res.push_back(root->val); inorder(root->right,res); } vector<int> inorderTraversal(TreeNode *root) { vector<int>res; inorder(root,res); return res; } //方法二:用栈模拟递归过程 vector<int> inorderTraversal(TreeNode *root) { vector<int>res; stack<TreeNode*>st; while(root || !st.empty()){ if (root==nullptr){ root = st.top(); st.pop(); res.push_back(root->val); root = root->right; } else{ st.push(root); root = root->left; } } return res; } //方法三:morris中序遍历空间复杂度O(1),时间复杂度O(n) vector<int> inorderTraversal(TreeNode *root) { vector<int>res; TreeNode*temp = nullptr; while (root){ if (root->left==nullptr){ res.push_back(root->val); root = root->right; } else{ temp = root->left; while(temp->right!=nullptr && temp->right!=root){ temp = temp->right; } if (temp->right==nullptr){ temp->right = root; root=root->left; } else{ res.push_back(root->val); temp->right = nullptr; root= root->right; } } } return res; }
import java.util.ArrayList; public class Solution { private ArrayList<Integer> result; public Solution() { result = new ArrayList<Integer>(); } public ArrayList<Integer> inorderTraversal(TreeNode root) { dfs(root); return result; } public void dfs(TreeNode node) { if(node==null) return; dfs(node.left); result.add(node.val); dfs(node.right); } }
class Solution { public: vector<int> inorderTraversal(TreeNode *root) { vector<int> ret; if(root == NULL) return ret; stack<TreeNode*> s; TreeNode* cur = root; while(cur != NULL || !s.empty()) { while(cur) { s.push(cur); cur = cur->left; } if(!s.empty()) { cur = s.top(); ret.push_back(cur->val); s.pop(); cur = cur->right; } } return ret; } };
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/*
思路一:
用栈来模仿递归的过程
每次pop()一次,代表访问了一次该节点。当第二次访问的时候,就可以打印该节点了
可以先画一棵比较完整的二叉树来模拟过程,然后写出代码
思路二:
可以建立线索二叉树来遍历整棵树
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> v;
if (NULL == root) {
return v;
}
stack<TreeNode*> stk;
stk.push(root);
stk.push(root);
while (!stk.empty()) {
TreeNode* temp = stk.top(); // 只是起到一个保存记录的作用,并不代表访问了这个节点,访问的操作是pop()
stk.pop(); // 访问一次该节点
if ((!stk.empty()) && (temp == stk.top())) {
if (temp->left != NULL) {
stk.push(temp->left);
stk.push(temp->left);
}
}
else { // 当第二次访问到这个节点的时候,可以打印了
v.push_back(temp->val);
if (temp->right != NULL) {
stk.push(temp->right);
stk.push(temp->right);
}
}
}
return v;
}
};
import java.util.*; public class Solution { public ArrayList<Integer> inorderTraversal(TreeNode root) { ArrayList<Integer> res = new ArrayList<Integer>(); Stack<TreeNode> s = new Stack<TreeNode>(); while(!s.isEmpty() || root != null) { while(root != null) { s.push(root); root = root.left; } root = s.pop(); res.add(root.val); root = root.right; } return res; } }
import java.util.*; /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public ArrayList<Integer> inorderTraversal(TreeNode root) { ArrayList<Integer> ret = new ArrayList<>(); if (root == null) { return ret; } Stack<TreeNode> stack = new Stack<>(); stack.push(root); TreeNode temp = root; while (!stack.isEmpty()) { //temp为根,一直向左,并入栈,直到空 while (temp != null) { if (temp.left != null) { stack.push(temp.left); } temp = temp.left; } //左孩子为空,访问完毕 //访问根 temp = stack.pop(); ret.add(temp.val); //右移,若不空,入栈,做为新的根 temp = temp.right; if (temp != null) { stack.push(temp); } } return ret; } }
import java.util.*; public class Solution { public ArrayList<Integer> inorderTraversal(TreeNode root) { ArrayList<Integer> list = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); while (root != null || ! stack.isEmpty()) { while (root != null) { stack.push(root); root = root.left; } root = stack.pop(); list.add(root.val); root = root.right; } return list; } }
class Solution {
public:
vector<int> inorderTraversal(TreeNode *root) {
vector<int> result;
inorderTra(root, result);
return result;
}
void inorderTra(TreeNode *root, vector<int> &result) {
if (root == NULL) { return; }
inorderTra(root->left, result);
result.push_back(root->val);
inorderTra(root->right, result);
}
};
import java.util.*; public class Solution { public ArrayList<Integer> inorderTraversal(TreeNode root) { ArrayList<Integer> list = new ArrayList<>(); return inorder(root, list); } public ArrayList<Integer> inorder(TreeNode root, ArrayList<Integer> list){ if(root == null) return list; inorder(root.left, list); list.add(root.val); inorder(root.right, list); return list; } }
//非递归 class Solution { public: vector<int> inorderTraversal(TreeNode *root) { vector<int> ans; if(root == NULL) return ans; stack<TreeNode* > s; TreeNode* p = root; while(p != NULL || !s.empty()) { while(p != NULL) { s.push(p); p = p->left; } if( !s.empty()) { p = s.top(); ans.push_back(p->val); s.pop(); p = p->right; } } return ans; } };
class Solution { public: /** * * @param root TreeNode类 * @return int整型vector */ vector<int> inorderTraversal(TreeNode* root) { vector<int> ans; function<void(TreeNode*)> inorder = [&](TreeNode* r) { if (!r) return; inorder(r->left); ans.emplace_back(r->val); inorder(r->right); }; inorder(root); return ans; } };