题目:
给出一棵二叉树,返回其中序遍历
样例:
给出二叉树 {1,#,2,3}
,
1
\
2
/
3
返回 [1,3,2]
.
你能使用非递归算法来实现么?
思路:
此题思路与二叉树的前序遍历的思路一样,只是将前序遍历的非递归算法中的V.push_back(root->val);移动到root=s[top--];之后。
遍历过程中遇到某结点时并不能立即添加到vector中,而是将它压栈,等到它的左子树遍历完毕后,再从栈中弹出并添加到vector中。
具体实现代码:
非递归:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
* @param root: The root of binary tree.
* @return: Inorder in vector which contains node values.
*/
public:
vector<int> inorderTraversal(TreeNode *root) {
// write your code here
vector<int>V;
TreeNode *s[100000];
int top=-1;
while(root!=NULL||top!=-1){
while(root!=NULL){
s[++top]=root;
root=root->left;
}
if(top!=-1){
root=s[top--];
V.push_back(root->val);
root=root->right;
}
}
return V;
}
};
递归:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
* @param root: The root of binary tree.
* @return: Inorder in vector which contains node values.
*/
public:
vector<int>V;
vector<int> inorderTraversal(TreeNode *root) {
// write your code here
if(root!=NULL){
inorderTraversal(root->left);
V.push_back(root->val);
inorderTraversal(root->right);
}
return V;
}
};
感悟:
要注意中序遍历与前序遍历的区别,但感觉还是用递归的方法更简单。